<分区>
我正在使用 JavaScript,我有一个 JSON 调用以字符串形式返回我的 UTC 日期时间,我想将它们转换为 UTC 日期对象。有没有人这样做过?我根本不想去本地时间。
标签 javascript
<分区>
我正在使用 JavaScript,我有一个 JSON 调用以字符串形式返回我的 UTC 日期时间,我想将它们转换为 UTC 日期对象。有没有人这样做过?我根本不想去本地时间。
最佳答案
在任何现代浏览器上,您只需将其传递到 Date
并在末尾添加一个 “Z”
:
var dt = new Date(yourString + "Z");
该格式是在 2009 年 12 月的 ES5 规范中为 JavaScript 定义的。“Z”
对于确保将字符串解释为 UTC 而不是本地时间¹很重要。
Date
对象跟踪特定的时间点,与时区无关。如果您使用 Date
的 UTC
方法(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());
¹ 这方面有一些历史。当该格式最初添加到 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 规范 says :
When the time zone offset is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.
所以 2016-11-22
被解释为 2016-11-22 午夜 UTC,但是 2016-11-22T00:00:00
被解释为 2016-本地时间午夜 11-22 点。奇怪,但真实。当然,规范中的这种最新语言可能还没有被所有实现正确实现(例如,我注意到 Chrome 54 弄错了)。
底线:您需要 "Z"
来确保字符串被解析为 UTC。
关于javascript - 我有一个 UTC 字符串,我想在 JavaScript 中将它转换为 UTC 日期对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40768606/