将UTC转换为当地时间并不适用于javascript

时间:2016-09-29 20:06:06

标签: javascript datetime

我的日期时间以UTC格式存储在数据库中。当他们被发送到客户端时,我想将它们转换为当地时间。

Javascript接收给定日期时间作为字符串,如下所示:

2016-09-29T19:13:40

如果我在字符串上运行new Date('2016-09-29T19:13:40'),我会得到这个输出:

Thu Sep 29 2016 19:13:40 GMT-0400 (Eastern Daylight Time)

虽然存在-0400偏移,但它不会改变时间。由于UTC偏移不会显示给用户,因此时间戳看起来就像4小时一样。

相反,如果我这样做: new Date('2016-09-29T19:13:40').toISOString();

输出结果为:

2016-09-29T23:13:40.000Z

正如您所看到的,它实际上将小时数调整为4并消除了偏移量。

为什么当我向javascript提供一个UTC日期时间转换为本地时,它所做的就是添加一个偏移量,但当我提供它认为是本地日期时间它并要求它转换为UTC它实际上调整时间?

如何将UTC日期时间调整为本地调整本地UTC的方式?

修改

这是一个小提琴:https://jsfiddle.net/qjmfLu67/1/

我在IE11和Chrome之间的行为有所不同。 IE11不会将UTC转换为本地。 Chrome确实将UTC转换为本地,如果它将日期识别为UTC,当您在其上运行toISOString时,它不会调整任何内容。

3 个答案:

答案 0 :(得分:0)

使用日期并不容易,尤其是在进行TZ转换时。我建议使用momentjs(http://momentjs.com/docs/),就像我一样。

// create a utc-zone moment
var x = moment.utc('2016-09-29T19:13:40')

x.format()
// output is "2016-09-29T19:13:40Z"

// adjust offset for the initial moment x by the local offset we get from moment created against local tz
x.utcOffset(moment().utcOffset());

x.format()
// output is "2016-09-29T22:13:40+03:00"

答案 1 :(得分:0)

对于IE11,您必须以完整的javascript格式传递日期字符串才能正常工作。

new Date("Thu Sep 29 2015 19:13 GMT")

答案 2 :(得分:0)

新日期('2016-09-29T19:13:40')

这缺少毫秒和“ Z”,这是从UTC到本地正确转换所必需的。

新日期('2016-09-29T19:13:40.000Z')应该为您提供相对于计算机的正确时间。