Javascript 忽略时区偏移的日期时间字符串(实验)

Javascript datetime strings ignoring timezone offset (experiment)

我最糟糕的噩梦是日期对象,所以我创建了一个 fiddle 来查看它是如何工作的,并尝试为 日期字符串 在以下格式 2015-10-05T11:49:13.587Z 但要注意当前时区。

基本上,我希望能够编写 new Date()(或类似的)并得到 2015-10-05T09:49:13.587Z 而不是 2015-10-05T11:49:13.587Z

似乎唯一显示正确 date/time 的方法是:

但是其中 none 正在返回一个日期对象,就像我想要的那样。那么正确的处理方法是什么?

请检查我的测试:http://codepen.io/Frondor/pen/PPmYpv

这种格式 - 2015-10-05T11:49:13.587Z - 是 Coordinated Universal Time (UTC) or the ISO 8601 格式中日期和时间的标准表示形式之一。

时区不会以这种格式显示,因为格式本身的目的是(如维基百科文章中所述):

Representation of dates and times is an international standard covering the exchange of date and time-related data.

但我们绝对可以用该格式显示日期以及当前时区的偏移量,但这违背了 "standard" 格式本身的目的。

您要求它产生不准确的时间。您要查找的格式表示 UTC 时间。我建议您检查您的要求,因为那里可能存在缺陷。
但如果这正是你想要的,你会说:
moment().format("YYYY-MM-DDThh:mm:ss.SSSS") + 'Z'

Basically, I want to be able to write new Date() (or similar) and get 2015-10-05T09:49:13.587Z instead of 2015-10-05T11:49:13.587Z.

您要求的时间是早两个小时。这样转换是无效的。

我认为您混淆了两个截然不同的事物:

  • UTC 不是一种格式。这是一个计时系统。当我们说 "in UTC" 时,我们的意思是时间值以世界时间呈现 - 全世界都一样,大致与 GMT 相同(英国格林威治时间,不考虑夏令时) .如果您的本地时间比 UTC 晚两个小时,那么 UTC 比您的本地时间早两个小时。

  • ISO-8601 格式是日期和时间的字符串表示形式。有几种形式,您所表达的是时间戳扩展格式。换句话说,它表示事件发生的实际时刻,根据日期、时间和与 UTC 的关系。

    在此格式中,Z 具体表示 "the value presented here is already in terms of UTC"。它与使用 +00:00.

  • 大致相同

因此,如果作为 ISO8601 字符串的 UTC 中的值是 2015-10-05T11:49:13.587Z,则相应的本地值(假设如您所说的 UTC-2)是 2015-10-05T09:49:13.587-02:00。这仍然是 ISO8601 格式,但不再是 UTC。

最简单的方法是 moment.js,使用 moment().format()