我正在使用JavaScript,我有一个JSON调用,它将我的UTC DateTimes作为字符串返回,我想将它们转换为UTC Date对象。有没有人这样做过?我根本不想去当地时间。
答案 0 :(得分:13)
在任何模糊的现代浏览器上,您只需将其传递到Date
,最后带有"Z"
:
var dt = new Date(yourString + "Z");
该格式是在2009年12月的ES5规范中为JavaScript定义的。"Z"
对于确保字符串被解释为UTC而非当地时间¹非常重要。
Date
个对象跟踪特定时刻,这与时区无关。如果您使用Date
的{{1}}方法(UTC
,getUTCFullYear
等),您将以UTC格式访问该时刻。 (如果您使用非UTC方法,则会将其转换为当地时间。)
示例:
getUTCMonths
¹关于这一点有一些历史。当格式最初添加到ES5规范时,假设是ISO-8601的子集,但ES5规范表示没有时区指示符表示UTC,而在ISO-8601中,没有时区指标表示当地时间。这导致了不一致的实现,其中一些符合ES5规范,而其他一些符合ISO-8601。该错误在2015年6月的ES2015规范中得到修复。现在,JavaScript的日期/时间格式确实是ISO-8601的一个子集,只是JavaScript的var str = "2016-11-22T17:14:00";
var dt = new Date(str + "Z");
console.log("UTC string:");
console.log(dt.toUTCString());
console.log("Local string");
console.log(dt.toString());
console.log("Hours UTC: " + dt.getUTCHours());
console.log("Hours local: " + dt.getHours());
总是有一个时间组件(一直到毫秒),而ISO-8601的概念是价值可能只是精确的特定值。也就是说,JavaScript中的Date
是特定日期和时间,但在ISO-8601中,它只是日期(没有隐含时间)。因此,当前(ES2016)JavaScript规范says:
如果不存在时区偏移,则仅日期表单将被解释为UTC时间,而日期时间表单将被解释为本地时间。
所以2016-11-22
在UTC午夜被解释为2016-11-22,但2016-11-22
在当地时间午夜被解释为2016-11-22。奇怪但真实。当然,规范中的这种最新语言可能还没有被所有实现正确实现(例如,我注意到Chrome 54错了)。
结论:您需要2016-11-22T00:00:00
来确保将字符串解析为UTC。