我的日期时间以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
时,它不会调整任何内容。
答案 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')应该为您提供相对于计算机的正确时间。