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 的方法是:
moment().format()
new Date().toLocaleString()
moment().toLocaleString()
moment().format().toLocaleString()
但是其中 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()
。
我最糟糕的噩梦是日期对象,所以我创建了一个 fiddle 来查看它是如何工作的,并尝试为 日期字符串 在以下格式 2015-10-05T11:49:13.587Z
但要注意当前时区。
基本上,我希望能够编写 new Date()
(或类似的)并得到 2015-10-05T09:49:13.587Z
而不是 2015-10-05T11:49:13.587Z
。
似乎唯一显示正确 date/time 的方法是:
moment().format()
new Date().toLocaleString()
moment().toLocaleString()
moment().format().toLocaleString()
但是其中 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 get2015-10-05T09:49:13.587Z
instead of2015-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()
。