带有 Date() 的奇怪 Javascript 时区

Weird Javascript Timezones with Date()

Javascript 绝望了,但我遇到了一个我似乎无法理解的问题,也不知道它是否是 JS 中定义的行为...

据我所知,new Date() returns 浏览器报告的当前时区的当前时间。在撰写本文时,我在意大利米兰 (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

然而,再次根据我的理解,将毫秒放入日期构造函数会创建一个基于大纪元时间的日期,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 时间戳并在用户当前时区中显示它造成了很多问题!

如有任何帮助或建议,我们将不胜感激!

非常感谢! :)

每个 Date 实例中的数字时间戳值,无论它是如何构造的,都表示与固定 UTC "epoch" 时间的偏移量。当您在您的语言环境中构建日期时,在设置 Date 实例时间戳时会考虑时区偏移量。当您通过 .getTimezoneOffset().

等区域设置相关 API 访问部分日期时,时区偏移量 会被考虑在内

因此,重要的是您如何获取 Date 实例的 date/time 信息 out。如果您使用 UTC API,您将获得 UTC 时间信息。如果您使用区域设置相关的 API,您将获得区域设置相关的值。

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

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

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