传递给"new Date"时,JavaScript 中 yyyy-mm-dd 和 yyyy/mm/dd 的不同结果



i在nodejs repl下执行以下语句,我在同一日期获得了两个不同的结果

var dateStr1 = "2015/03/31";
var dateStr2 = "2015-03-31";
var date1 = new Date(dateStr1);//gives Tue Mar 31 2015 00:00:00 GMT+0530 (IST)
var date2 = new Date(dateStr2);//gives Tue Mar 31 2015 05:30:00 GMT+0530 (IST)

在第一个小时,最小,秒为零,而在第二个小时,默认一个小时,min被设置为时区小时,最小为5:30

它归结为Date.parse()如何处理ISO-8601日期格式。

日期时间字符串可以以ISO 8601格式为单位。例如,可以通过并解析" 2011-10-10"(仅日期)或" 2011-10-10T14:48:00"(日期和时间)。UTC时区用于解释不包含时区信息的ISO 8601格式的参数(请注意,Ecmascript ED 6草案指定没有时区的日期时间字符串将被视为本地,而不是UTC)

您的第一个日期格式2015/03/31被认为是2015年3月31日,在您当前的时区。
您的第二个日期格式2015-03-31被视为ISO-8601,并被认为是2015年3月31日,在 utc时区。。

从链接的文档中走向的"假定时区域的差异"更加详细:

给出了" 2014年3月7日"的日期字符串,parse()假定本地时区,但给定诸如" 2014-03-07"之类的ISO格式,它将假设UTC的时区。因此,使用这些字符串产生的日期对象将代表不同的时刻,除非将系统设置为UTC的局部时区。这意味着两个看起来等同的日期字符串可能会导致两个不同的值,具体取决于要转换的字符串格式(此行为在Ecmascript Ed 6中更改为6,以便两者都将两者视为局部)。

第一个字符串" 2015/03/31"是根据Ecmascript标准的不支持格式。每当不支持的值传递给构造函数时,其行为取决于实现,即标准不说实现必须做什么。一些浏览器,例如Firefox,尝试猜测格式是什么,显然它在午夜 local 时间创建了一个日期对象。其他浏览器可能会返回NaN或以不同的方式解释零件。

第二个字符串" 2015-03-31"是正确格式的ISO 8601日期。对于这些字符串,有明确的规则,所有浏览器都将其解释为那个日期,午夜,UTC。

最新更新