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

标签 javascript

<分区>

我正在使用 JavaScript,我有一个 JSON 调用以字符串形式返回我的 UTC 日期时间,我想将它们转换为 UTC 日期对象。有没有人这样做过?我根本不想去本地时间。

最佳答案

在任何现代浏览器上,您只需将其传递到 Date 并在末尾添加一个 “Z”:

var dt = new Date(yourString + "Z");

该格式是在 2009 年 12 月的 ES5 规范中为 JavaScript 定义的。“Z” 对于确保将字符串解释为 UTC 而不是本地时间¹很重要。

Date 对象跟踪特定的时间点,与时区无关。如果您使用 DateUTC 方法(getUTCFullYeargetUTCMonths 等),您将访问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/

相关文章:

javascript - 如何使用react-router v6在组件内传递props

javascript - jsp页面js函数中的EL表达式

javascript - 语法错误 : expected expression, 得到 ''

javascript - ES6 中 block 级函数的精确语义是什么?

javascript - 你可以在 jQuery 中使用 length() 按图像名称计算元素吗?

javascript - 如何通过调用函数来更改输入类型文件的值?

javascript - 判断一个元素是否没有子元素

javascript - 有没有办法为特定的命名空间停止传播?

javascript - 带有文本的跨度的随机位置

javascript - body 背景模糊功能不适用于多种模式