为什么javascript会对这些相同的日期进行不同的解释
这里发生了什么:为什么javascript会对这些相同的日期进行不同的解释,javascript,date,Javascript,Date,这里发生了什么: > new Date('Apr 15 2013'); Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time) > new Date('04/15/2013'); Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time) > new Date('2013-04-15'); Mon Apr 15 2013 01:00:00 GMT+0100 (GMT Daylig
> new Date('Apr 15 2013');
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time)
> new Date('04/15/2013');
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time)
> new Date('2013-04-15');
Mon Apr 15 2013 01:00:00 GMT+0100 (GMT Daylight Time)
显然,其中一个被解释为UTC时间,而另外两个被解释为本地时间。是什么导致了解析上的差异?来自:
根据字符串的内容,该字符串可以解释为本地时间、UTC时间或其他时区的时间。函数首先尝试根据日期时间字符串格式()中调用的规则解析字符串的格式。如果字符串不符合该格式,函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式
在您提供的所有格式中,只有官方支持的是
'2013-04-15'
,因此其他格式似乎回到依赖于实现的行为。Date构造函数委托,似乎Date.parse
有两个变体:
给定一个表示时间的字符串,parse返回时间值。信息技术
接受RFC2822/IETF日期语法(RFC2822第3.3节),例如:。
“1995年12月25日星期一格林尼治标准时间13:30:00”。它了解美国大陆
时区缩写,但对于一般用途,请使用时区偏移,
例如,“1995年12月25日星期一13:30:00GMT+0430”(4小时30分钟
格林威治子午线以东)如果未指定时区,
假定本地时区为。GMT和UTC被认为是等效的
或者,日期/时间字符串可以是
ISO 8601格式。从JavaScript1.8.5(Firefox4)开始,它是
支持ISO 8601的标准。例如,“2011-10-10”(仅日期)或
“2011-10-10T14:48:00(日期和时间)可以传递和解析
显然,它们在本地时区的行为有所不同
编辑:看起来这是您的第三个示例是规范实际解释的唯一示例。当您使用单个参数调用
日期
构造函数时,(其中v
是传递给构造函数的字符串):
将v
解析为日期,解析方式与Parse
方法(15.9.4.2)完全相同;将v
作为该日期的时间值
将尝试分析字符串(添加了强调):
根据字符串的内容,可以将字符串解释为本地时间、UTC时间或其他时区的时间。函数首先尝试根据日期-时间字符串格式(15.9.1.15)中调用的规则解析字符串格式
如果字符串不符合该格式,函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式
“”是YYYY-MM-DDTHH:MM:ss.sssZ
,还定义了yyy-MM-DD
格式的较短版本,这是您在第三个示例中使用的格式
对于其他示例,解析将失败,行为由实现定义。您从MDN引用的部分可能详细介绍了Gecko的实现行为(因为正如规范所示,这种情况由实现决定)@Eric:它可能是Firefox的一个实现细节,也可能是一个非官方但得到广泛支持的功能。Chrome的行为似乎与之相同,所以可能是后者。+1.这从图形上突出了试图解析任意日期字符串的危险。同样的警告也适用于其他语言(php的
strotime()中的怪癖)
必须被看到才能被相信)。最好的建议是始终以固定的已知格式接受日期,最好是yyy-mm-dd
,或者只是始终使用整数时间戳。其他任何事情都是在玩火。在系统之间发送数据时,这一点更为适用。表单上的用户输入应该使用日历控件,而不是自由类型。