1

我已经在 UTC 中设置了截止日期,如下所示,我想知道 toLocaleString() 方法在用户的本地机器上究竟会做什么。例如,如果他们处于识别夏令时的时区,它会考虑夏令时吗?或者我是否需要插入额外的代码来检查用户的位置,然后修复显示的时间?

http://javascript.about.com/library/bldst.htm

var deadline = new Date('5/1/2013 ' + "16:15" + ' UTC');
alert(deadline.toLocaleString());
4

3 回答 3

2

当您使用“UTC”时,日期本身将是 UTC 格式,但会 toLocaleString()考虑客户的区域设置,这意味着它将返回字符串中更新的日期,其中包含客户区域和区域设置(DST、日期/时间格式等)。
正如 JS 文档所描述的那样:“toLocaleString() 方法使用区域设置将 Date 对象转换为字符串。” .
如果您想避免这种情况,请改用该toUTCString()方法。

我还建议阅读JavaScript 日期问题的公认解决方案:处理夏令时的最佳方法是什么?避免(至少,尽量避免 :) 与 JS、浏览器和语言环境相关的未来问题。

希望这可以帮助!

于 2013-05-01T12:58:59.910 回答
2

我们不知道该toLocaleString方法究竟做了什么(§15.9.5.5):

此函数返回一个字符串值。String 的内容是 implementation-dependent,但旨在以一种方便的、人类可读的形式表示当前时区中的 Date ,该形式与宿主环境的当前语言环境的约定相对应。

但是,是的,如果 DST 在当前本地时区处于活动状态,大多数实现都会考虑 DST。对于你的例子,我得到"Mittwoch, 1. Mai 2013 18:15:00“ - CEST

我是否需要插入额外的代码来检查用户的位置,然后修复显示的时间?

我认为您可以信任toLocaleString- 浏览器应该尊重用户的设置。如果您想手动完成,请查看timezone.js

于 2013-05-01T13:01:59.613 回答
2

一般来说,答案是肯定的。JavaScript 将根据运行它的计算机的时区设置在适当的本地时间表示 UTC 值。这包括对 DST 的调整。但是,正如其他人指出的那样,细节是特定于实现的。

如果您想要一致的输出,我会使用库来格式化您的日期,而不是依赖默认实现。最好的库(恕我直言)是moment.js。他们主页上的实时示例将让您了解它可以做什么。

更新

如果您传递要转换为正确本地时间的 UTC 值,并且该时间属于时区规则与当前时间不同的时段 - 那么结果将无效。这很疯狂,但却是真实的——并且是 ECMA 规范中的设计。阅读 - JavaScript 时区对于过去的夏令时转换规则是错误的

于 2013-05-01T14:47:32.437 回答