传递给“新日期”时,javascript中yyyy-mm-dd和yyyy / mm / dd的结果不同

时间:2015-05-12 18:48:40

标签: javascript date format

我在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)

在第1小时,min,seconds全为零,而在第2小时默认为小时,min设置为时区小时,min为5:30

2 个答案:

答案 0 :(得分:17)

归结为Date.parse()处理ISO-8601 date format的方式。

  

日期时间字符串可以是ISO 8601格式。例如," 2011-10-10" (仅限日期)或" 2011-10-10T14:48:00" (日期和时间)可以传递和解析。 UTC时区用于解释ISO 8601格式中不包含时区信息的参数(请注意,ECMAScript ed 6 draft指定不带时区的日期时间字符串将被视为本地,而不是UTC)

您的第一个日期格式2015/03/31assumed,即2015年3月31日当天时区上午12点
您的第二个日期格式2015-03-31被视为ISO-8601,并假定为2015年3月31日上午12点 UTC时区

"假定时区的差异"来自链接文档的标题更详细:

  

给定日期字符串" 2014年3月7日",parse()假设一个本地时区,但是给出了ISO格式,例如" 2014-03-07"它将假定UTC的时区。因此,使用这些字符串生成的Date对象将表示不同的时刻,除非系统设置了UTC的本地时区。这意味着看起来等效的两个日期字符串可能会导致两个不同的值,具体取决于要转换的字符串的格式(ECMAScript ed 6中的此行为已更改,因此两者都将被视为本地)。

答案 1 :(得分:7)

根据ECMAScript标准,第一个字符串2015/03/31实际上是不受支持的格式。每当将不受支持的值传递给构造函数时,它的行为都是未定义的,即标准并未说明实现必须执行的操作。有些浏览器,比如Firefox,试图猜测格式是什么,显然它会在午夜本地时创建一个日期对象。其他浏览器(如Safari)会返回NaN

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

相关问题