我正在尝试将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上使用谷歌浏览器,如果相关的话。
答案 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());