javascriptdate时区问题

我需要一个js Date对象,指定date和年份的值。 我期望new Date("2000-01-01")给我date对象与2000作为getFullYear()值,但如果我的电脑的时间设置设置为芝加哥时区,我得到Fri Dec 31 1999 18:00:00 GMT-0600 (CST)和布宜诺斯艾利斯: Fri Dec 31 1999 22:00:00 GMT-0200 (ARST)

有没有办法创buildDate对象,无论用户的机器上设置了什么时区,使用.getFullYear()函数返回我们在构造函数中设置的date?

更新:我需要这个Date对象在另一个库中使用(调用它的.getFullYear()方法,所以使用UTC getters并没有真正的帮助。

在JavaScript中将stringparsing为Date时, YYYY-MM-DD格式的值将被解释为UTC值,而不是本地时间值。

关键是这些部分之间用连字符分开,并且string中没有时区信息。 ECMAScript 5.1规范在§15.9.1.15中说:

…缺席时区偏移的值是“Z”。

这意味着,如果你不指定偏移量,它会假定你的意思是UTC。

请注意,由于这与ISO-8601所说的相反,ECMAScript 2015(6.0)中的行为已经发生了变化,在§20.3.1.16中说过 :

…如果时区偏移量不存在,则将date时间解释为当地时间。

因此,当ES6的这个规定被正确实现时,这个格式的string值被解释为UTC,而不是本地时间。 我在这里博客了这个。

解决方法很简单。 用斜线replace连字符:

 var s = "2000-01-01"; var dt = new Date(s.replace(/-/g, '/')); 

另一个可以接受的解决方法是将中午的时间分配给date,而不是午夜。 这将被parsing为当地时间,并且足够远以避免任何DST冲突。

 var s = "2000-01-01"; var dt = new Date(s + "T12:00:00"); 

另外,考虑一个像moment.js这样的图书馆更合理。

 var s = "2000-01-01"; var dt = moment(s, 'YYYY-MM-DD').toDate(); 

您可以将新的方法写入'Date.prototype',并使用它获取包含本地时区偏移量的date。

  //return the date with depend of Local Time Zone Date.prototype.getUTCLocalDate = function () { var target = new Date(this.valueOf()); var offset = target.getTimezoneOffset(); var Y = target.getUTCFullYear(); var M = target.getUTCMonth(); var D = target.getUTCDate(); var h = target.getUTCHours(); var m = target.getUTCMinutes(); var s = target.getUTCSeconds(); return new Date(Date.UTC(Y, M, D, h, m + offset, s)); };