javascript日期时区问题

时间:2015-03-20 19:54:29

标签: javascript date datetime timezone

我需要一个具有日期和年份指定值的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并不能提供帮助。

3 个答案:

答案 0 :(得分:18)

在JavaScript中将字符串解析为Date时,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)将被解释为本地时间。我在博客上写了here

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

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

另一种可接受的解决方法是将日期时间而不是午夜时间分配给日期。这将被解析为本地时间,并且足够远以避免任何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();

答案 1 :(得分:1)

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

  //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));
  };

答案 2 :(得分:0)

这里有一个小技巧可以帮助某人:

let date = new Date();
console.log(date); // -> Fri May 28 2021 01:04:26 GMT+0200 (Central European Summer Time)

const tzOffsetMin = Math.abs(date.getTimezoneOffset()) // the minutes of the offset timezone
const tzOffsetHour = tzOffsetMin / 60; // timezone offset in hour
console.log(tzOffsetHour); // -> 2

date.setHours(date.getHours() + tzOffsetHour); // sum to date hour the timezoneoffset
const isovalue = date.toISOString();
console.log(isovalue); // -> 2021-05-28T01:04:26.156Z

通过这种方式,无论您身在何处,您都可以“绕过”时区偏移