javascript日期时区问题

javascript Date timezone issue

我需要一个具有日期和年份指定值的js Date对象。 我期待
new Date("2000-01-01")给我带有2000作为getFullYear()值的Date对象,但是如果我的计算机的时间设置设置为芝加哥时区,我得到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并没有真正帮助。


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

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

... The value of an absent time zone offset is"Z".

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

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

... If the time zone offset is absent, the date-time is interpreted as a local time.

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

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

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

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

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

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
  //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));
  };