gpt4 book ai didi

javascript日期时区问题

转载 作者:可可西里 更新时间:2023-11-01 02:18:06 34 4
gpt4 key购买 nike

我需要一个带有指定日期和年份值的 js 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 )

有没有办法创建 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 的这种格式的字符串值将被解释为本地时间。我已经写了关于这个的博客 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();

关于javascript日期时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29174810/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com