javascript日期时区问题

eag*_*gor 11 javascript timezone datetime date

我需要一个具有日期和年份指定值的js Date对象.我希望 new Date("2000-01-01")给我一个2000对象的Date对象getFullYear(),但是如果我的计算机的时间设置设置为芝加哥时区,我会得到Fri Dec 31 1999 18:00:00 GMT-0600 (CST),而对于布宜诺斯艾利斯:Fri Dec 31 1999 22:00:00 GMT-0200 (ARST).

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

更新:我需要将此Date对象用于另一个库(调用其.getFullYear()方法,因此使用UTC getter实际上并没有帮助.

Mat*_*int 19

Date在JavaScript中将字符串解析为a 时,YYYY-MM-DD格式中的值将被解释为UTC值,而不是本地时间值.

关键是部件用连字符分隔,并且字符串中没有时区信息.ECMAScript 5.1规范在§15.9.1.15中说:

...缺席时区偏移的值是"Z".

这意味着,如果您没有指定偏移量,它将假设您的意思是UTC.

请注意,由于这与ISO-8601所说的相反,因此ECMAScript 2015(6.0)中的行为已经改变,在§20.3.1.16中说明:

...如果没有时区偏移,则将日期时间解释为本地时间.

因此,当正确实现ES6的这一规定时,此格式的字符串值(以前将被解释为UTC)将被解释为本地时间.我在这里写了这篇博文.

解决方法很简单.用斜杠替换连字符:

var s = "2000-01-01";
var dt = new Date(s.replace(/-/g, '/'));
Run Code Online (Sandbox Code Playgroud)

另一种可接受的解决方法是将日期时间而不是午夜时间分配给该日期.这将被解析为本地时间,并且足够远以避免任何DST冲突.

var s = "2000-01-01";
var dt = new Date(s + "T12:00:00");
Run Code Online (Sandbox Code Playgroud)

或者,考虑像moment.js这样的库更加明智.

var s = "2000-01-01";
var dt = moment(s, 'YYYY-MM-DD').toDate();
Run Code Online (Sandbox Code Playgroud)

  • 使用斜杠使其成为非ISO兼容的字符串,大多数实现将其解释为本地时间.以"yyyy/mm/dd"格式而不是"mm/dd/yyyy"或"dd/mm/yyyy"保持它也有助于消除区域问题. (2认同)