带有Date()的怪异Javascript时区

时间:2018-10-07 13:48:06

标签: javascript date timezone unix-timestamp

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

据我了解,new Date()返回浏览器报告的当前时区中的当前时间。在撰写本文时,我在意大利米兰(格林尼治标准时间+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构造函数中会根据大纪元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时间戳并将其显示在用户当前时区中造成了很多问题!

对此将提供任何帮助或建议!

非常感谢! :)

1 个答案:

答案 0 :(得分:1)

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

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

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

现在,关于如何处理数据库中的系统时间戳值,这取决于应用程序的工作方式以及该日期中的含义。如果让用户看到您的服务器将如何处理日期的日期很重要,请使用相对于区域设置的API在服务器上格式化日期。如果您的应用程序根据本地时间进行某些工作,那将是有意义的。例如,某些银行应用程序(在美国)在晚上执行某些操作,但在美国大陆,则是在深夜时段执行“夜间”操作。

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