【问题标题】:Weird Javascript Timezones with Date()带有 Date() 的奇怪 Javascript 时区
【发布时间】:2018-10-07 13:48:06
【问题描述】:

Javascript 在这里毫无希望,但我遇到了一个我似乎无法理解的问题,并且不知道它是否是 JS 中定义的行为......

据我了解,new Date() 返回浏览器报告的当前时区的当前时间。在撰写本文时,我在意大利米兰 (GMT +0200 CEST),所以在执行以下操作时:

var date = new Date();
console.log(date);
console.log(date.getTimezoneOffset());

我得到了,正如预期的那样:

Sun Oct 07 2018 15:42:12 GMT+0200 (Central European Summer Time)
-120

但是,根据我的理解,再次将毫秒投入 Date 构造函数会创建一个基于 Epoch Time 的日期,即 1970 年 1 月 1 日 00:00:00 GMT +0000 - 那么为什么如果我执行:

var date = new Date(0); // Note The 0
console.log(date);
console.log(date.getTimezoneOffset())

我得到:

Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
-60

浏览器是否出于某种原因更改了它认为我所在的时区?这给我从数据库中检索 unix 时间戳并将其显示在用户的当前时区中造成了很多问题!

对此的任何帮助或建议将不胜感激!

非常感谢! :)

【问题讨论】:

  • 好吧,在 1970 年 1 月 1 日,你会在 CET,因为它是在冬天的中间。但我不知道浏览器会有这种夏令时意识。
  • @RobinZigmond 通常是底层操作系统知道夏令时(或“夏季”)时间。
  • 当然,谢谢@Pointy

标签: javascript date timezone unix-timestamp


【解决方案1】:

每个 Date 实例中的数字时间戳值,无论它是如何构造的,都表示相对于固定 UTC“纪元”时间的偏移量。在您的语言环境中构建日期时,在设置 Date 实例 timstamp 时会考虑时区偏移量。当您通过.getTimezoneOffset() 等与语言环境相关的 API 访问部分日期时,会考虑时区偏移。

因此,重要的是您如何输出 Date 实例的日期/时间信息。如果您使用 UTC API,您将获得 UTC 时间信息。如果您使用相对于语言环境的 API,您将获得相对于语言环境的值。

let d = new Date();
console.log("locale-relative: " + d);
console.log("UTC: " + d.toUTCString());

现在,关于如何处理数据库中的系统时间戳值,这取决于应用程序的工作方式以及日期在该上下文中的含义。如果用户根据您的服务器将如何处理日期来查看日期很重要,请使用与语言环境相关的 API 格式化服务器上​​的日期。如果您的应用程序根据当地时间做一些工作,那将是有意义的。例如,一些银行应用程序(在美国)在晚上做事,但在美国大陆的深夜时间里是“晚上”。

另一方面,如果您存储的日期应该以 他们的 语言环境的形式显示给您的用户,则向客户端发送时间戳并将您的日期格式化为具有语言环境的客户端的字符串- 相对 API。这对于允许用户设置警报等的应用程序是合适的:通常,用户根据自己的本地时间进行思考是有意义的。

【讨论】:

  • 对!所以在我的例子中,我正在检索时间戳,比如1514764800,即Monday, January 1, 2018 12:00:00 AM GMT +0000 - 在console.log(1514764800 * 1000) 之后,Mon Jan 01 2018 01:00:00 GMT+0100 (Central European Standard Time) 不是指定日期的 TZ,也不是用户的语言环境?
  • 为什么你认为这不在用户的语言环境中?请注意,通常 1 月不是夏令时月份,因此该日期的偏移量是 0100 而不是 0200。
  • @FrankieDee 区域设置相关 API 采用通用时间值,并向您展示在适当区域设置中的样子。仅仅因为现在 DST 有效并不意味着它总是有效。非 DST 月份的日期/时间值与非 DST 偏移一起显示。
  • 啊,好吧 - 我不知道发生了这种情况,现在这更有意义了.. 我正在使用 GMT +0000 日期,并希望它根据我所在的时区向我显示目前,即,如果有的话,有夏令时效果。当然,根据日期的时间是否有夏令时效果来显示它是有意义的。谢谢你澄清!跨度>
  • @FrankieDee — 对 DST 和其他时区更改的历史支持只是最近的,不是强制性的。以前,Date 方法只是推断当前设置,就好像它们总是应用一样。
猜你喜欢
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2012-07-25
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多