JavaScript正式支持 简化 ISO 8601扩展格式。格式如下:YYYY-MM- DDTHH:mm:ss.sssZ
。字母T
是日期/时间分隔符,并且Z
是指定为Z
(对于UTC)或时差+
或-
后跟时间表达式的时区偏移量HH:mm
。该格式的某些部分(例如时间)可以省略。
请注意,年份 必须 至少有四个数字,月份/日期/小时/分钟/秒 必须 具有精确的两位数字,毫秒 必须 具有精确的三位数。例如,99-1-1
不是有效的日期字符串。
这些是有效日期(时间)字符串的一些示例:
省略时区偏移时,日期时间将解释为用户本地时间。当您完全省略时间时,日期将解释为UTC。
:根据规范,所有现代且相当老旧的浏览器和实现都支持 全长 日期时间格式。 但是 ,不带时区的日期(时间)字符串的处理有所不同(有关详细信息,请参见下面的“缺少时区偏移”)。你应该 不是 没有时区(状态2018)使用日期时间字符串。而是以毫秒为单位传递unix时间戳或将日期不同部分的单独参数传递给Date
构造函数。
大多数浏览器还支持其他一些格式,但是未指定它们,因此并非在所有浏览器中都以相同的方式工作。如果有的话,您应该只使用上面说明的日期时间字符串格式。其他所有格式可能会在其他浏览器甚至同一浏览器的其他版本中损坏。
如果您碰到的Invalid Date
不是日期对象,则很可能使用了无效的日期时间字符串。
现在,有了更多细节。
自诞生以来,ECMAScript(JavaScript语言实现的规范)一直在newDate
规范和Date.parse
规范中支持日期字符串。但是,第一个版本实际上并未指定日期时间格式。在2009年ES5引入了日期时间格式规范后,情况发生了变化。
ECMAScript将日期时间字符串格式指定为ISO8601扩展格式的简化形式。格式如下:。YYYY-MM-DDTHH:mm:ss.sssZ
该规范还提到,如果“字符串不符合[指定的]格式,则该函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式”,这可能会导致不同浏览器中的日期不同。
ECMAScript不考虑任何用户本地日期时间格式,这意味着您不能使用国家或地区特定的日期时间格式。
该规范还包括以下较短的格式。
此格式包括仅日期形式:
它还包括“日期时间”格式,该格式由上述仅日期格式之一构成,后跟以下时间格式之一,并附加了可选的时区偏移量:
[…]如果MM
或DD
字段不存在,"01"
则用作值。如果HH
,mm
或者ss
字段不存在"00"
被用作值和一个缺席值sss
字段是"000"
。如果不存在时区偏移,则仅日期格式将被解释为UTC时间,而日期时间格式将被解释为本地时间。
有关缺少浏览器支持的更多信息,请参见下面的“缺少时区偏移”。
格式字符串中的非法值(越界以及语法错误)意味着该格式字符串不是该格式的有效实例。
例如,new Date('2018-01-32')
和new Date('2018-02-29')
将导致 Invalid Date
。
ECMAScript的日期时间格式还指定了扩展的年份,该年份是六位数的年份值。这样的扩展年字符串格式的示例看起来像+287396-10-12T08:59:00.992Z
,它表示公元287396年中的日期。扩展年可以是正数或负数。
ECMAScript指定了多种日期对象属性。给定有效的日期对象,您可以Date.prototype.toISOString()
用来获取有效的日期时间字符串。请注意,时区始终为UTC。
new Date().toISOString() // "2018-08-05T20:19:50.905Z"
还可以Invalid Date
使用以下功能检测日期对象是否有效。
function isValidDate(d) {
return d instanceof Date && !isNaN(d);
}
可在JavaScript中检测“无效日期”Date实例中找到源和更多信息。