我有一个UTC字符串,我想在JavaScript中将其转换为UTC日期对象

ser*_*oth 4 javascript

我正在使用JavaScript,我有一个JSON调用,它将我的UTC DateTimes作为字符串返回,我想将它们转换为UTC Date对象.有没有人这样做过?我根本不想去当地时间.

T.J*_*der 16

在任何隐约现代的浏览器,你就传递到Date"Z"上月底:

var dt = new Date(yourString + "Z");
Run Code Online (Sandbox Code Playgroud)

该格式是在2009年12月的ES5规范中为JavaScript定义的."Z"确保字符串被解释为UTC而非本地时间¹非常重要.

Date对象跟踪特定的时刻,这与时区无关.如果您使用DateUTC方法(getUTCFullYear,getUTCMonths等),您将以UTC格式访问该瞬间.(如果使用非UTC方法,则会将其转换为本地时间.)

例:

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());
Run Code Online (Sandbox Code Playgroud)


¹关于这方面有一些历史.当格式最初添加到ES5规范时,它应该是ISO-8601的子集,但ES5规范表示没有时区指示符表示UTC,而在ISO-8601中,没有时区指示符表示本地时间.这导致了不一致的实现,其中一些符合ES5规范,而其他一些符合ISO-8601.这个错误在2015年6月的ES2015规范中得到了修复.现在JavaScript的日期/时间格式确实是ISO-8601的一个子集,除了JavaScript Date总是有一个时间组件(一直到毫秒),而ISO-8601有概念,一个值可能只是精确的特定值.也就是说,2016-11-22在JavaScript中是一个特定的日期时间,但在ISO-8601中,它只是日期(没有时间暗示).因此,当前(ES2016)JavaScript规范:

如果不存在时区偏移,则仅日期表单将被解释为UTC时间,而日期时间表单将被解释为本地时间.

因此2016-11-22在UTC午夜被解释为2016-11-22,但在当地时间午夜2016-11-22T00:00:00被解释为2016-11-22.奇怪但真实.当然,规范中的这种最新语言可能还没有被所有实现正确实现(例如,我注意到Chrome 54错了).

底线:您需要"Z"确保将字符串解析为UTC.

  • @seroth:正如Alnitak所说,Z表示UTC.关于你的小提琴:再次,正如我在答案中所说,"Date"实例代表一个时间点,不论时区如何,它是*你如何访问*日期中的数据,决定你是否在当地时间看到它或UTC.你的小提琴是使用默认的`toString`,它转换为当地时间.如果您使用`toUTCString`,您将获得UTC信息:https://jsfiddle.net/n9aqysq9/1/ (3认同)
  • @seroth 不,Z 代表“祖鲁时间”,是指 UTC+0000 的另一种方式 (2认同)