使用破折号而不是斜杠将日期字符串转换为日期对象会产生不一致的结果

时间:2017-09-22 21:23:29

标签: javascript datetime

我正在尝试将javascript日期字符串转换为日期对象。似乎当我用斜杠格式化字符串时,比如2010/05/21,我得到了我期望的日期对象,但是当我用短划线格式化字符串时,如2010-05-21,我得到一个不同的日期对象,似乎是指前一天。

以下代码说明了我的问题:

var aDate = new Date('2010-05-21')
console.log(aDate.toDateString())
console.log(aDate.toISOString())

console.log('=-=-=-=-=')

var anotherDate = new Date('2010/05/21')
console.log(anotherDate.toDateString())
console.log(anotherDate.toISOString())

上面的代码产生以下输出:

2010-05-21T00:00:00.000Z
Thu May 20 2010
=-=-=-=-=
2010-05-21T06:00:00.000Z
Fri May 21 2010

似乎问题的一部分可能与时区有关,因为获取日期对象的ISO字符串显示日期对象彼此间隔6小时,但我不知道为什么使用破折号而不是斜线因为那个。我在MacOS Sierra上使用谷歌浏览器,如果相关的话。

1 个答案:

答案 0 :(得分:1)

2010/05/21是非ISO日期格式,因此支持将取决于浏览器实现。有些浏览器可能拒绝它,其他浏览器会接受它但使用不同的时区。您的浏览器似乎正在使用您的本地时区解析2010/05/21

2010-05-21采用简化的ISO 8601格式,因此ES5 +具有必须如何解析的规范。特别是it must assume the UTC time zone

您可以通过将其与浏览器解析ISO 8601日期和时间(ES5规范称为must use the local time zone)的方式进行比较来验证它是否正在使用您的本地时区。

var dateNonISO = new Date('2010/05/21');
var dateLocal = new Date('2010-05-21T00:00:00');
var dateUTC = new Date('2010-05-21');

console.log("Non-ISO:", dateNonISO.toISOString());
console.log("ISO Local:", dateLocal.toISOString());
console.log("ISO UTC:", dateUTC.toISOString());