JavaScript中的有效日期时间字符串是什么?

JavaScript中的有效日期时间字符串是什么?,javascript,string,date,datetime,time,Javascript,String,Date,Datetime,Time,在JavaScript中使用newdate或Date.parse时,我不能只传递任意的日期格式。根据格式的不同,我得到的日期与我想要的不同,甚至是无效日期,而不是日期对象。某些日期格式在一个浏览器中工作,但在其他浏览器中不工作。那么我应该使用哪种日期时间格式呢 其他问题: 所有浏览器都支持相同的格式吗?Mozilla Firefox、Google Chrome、Microsoft Internet Explorer、Microsoft Edge和Apple Safari如何处理日期时间字符串?

在JavaScript中使用
newdate
Date.parse
时,我不能只传递任意的日期格式。根据格式的不同,我得到的日期与我想要的不同,甚至是
无效日期
,而不是日期对象。某些日期格式在一个浏览器中工作,但在其他浏览器中不工作。那么我应该使用哪种日期时间格式呢

其他问题:

  • 所有浏览器都支持相同的格式吗?Mozilla Firefox、Google Chrome、Microsoft Internet Explorer、Microsoft Edge和Apple Safari如何处理日期时间字符串?Node.js呢

  • 它是否考虑了本地日期格式?例如,如果我住在瑞士,并且日期格式为2018年7月30日,我可以使用
    新日期('2018年7月30日')

  • 它是否考虑了当地时区

  • 如何从日期对象获取日期时间字符串

  • 如何检测无效的日期时间字符串

  • 像Moment.js这样的日期库如何处理日期字符串

如果你没有注意到,我回答了我自己的问题()。

要点 JavaScript正式支持ISO 8601扩展格式的简化。格式如下:
YYYY-MM-DDTHH:MM:ss.sssZ
。字母
T
是日期/时间分隔符,
Z
是指定为
Z
(UTC)或
+
-
后跟时间表达式
HH:mm
的时区偏移量。 该格式的某些部分(如时间)可以省略

请注意,年必须至少有四位数字,月/日/小时/分/秒必须正好有两位数字,毫秒必须正好有三位数字。例如,
99-1-1
不是有效的日期字符串

以下是有效日期(时间)字符串的一些示例:

  • 2018-12-30
  • 2018-12-30T20:59
  • 2018-12-30T20:59:00
  • 2018-12-30T20:59:00.000Z
  • 2018-12-30T20:59:00.000+01:00
  • 2018-12-30T20:59:00.000-01:00
忽略时区偏移时,日期时间将解释为用户本地时间。 如果完全忽略时间,则日期将被解释为UTC

重要: 根据规范,所有现代和相当古老的浏览器和实现都支持完整的日期-时间格式。 但是,在处理没有时区的日期(时间)字符串时存在差异(有关详细信息,请参阅下面的“缺少时区偏移”)。不应使用没有时区的日期时间字符串(状态2018)。 而是将日期传递给
构造函数

大多数浏览器还支持一些其他格式,但没有指定这些格式,因此不能以相同的方式在所有浏览器中工作。 如果有的话,您应该只使用上面解释的日期-时间字符串格式。 在其他浏览器中,甚至在同一浏览器的其他版本中,每种其他格式都可能中断

如果遇到的是
无效日期
,而不是日期对象,则很可能是使用了无效的日期时间字符串


现在再详细介绍一下

日期时间字符串格式 ECMAScript(JavaScript语言实现的规范)从一开始就支持()和()中的日期字符串。 但是,第一个版本实际上没有指定日期时间格式。 这在2009年发生了变化,当时ES5引入了日期时间格式的规范

基础知识 ECMAScript将指定为的简化。格式如下:
YYYY-MM-DDTHH:MM:ss.sssZ

  • YYYY
    是公历前一年0000到9999的十进制数字
  • -
    (连字符)在字符串中出现两次
  • MM
    是一年中从1月1日到12月12日的月份
  • DD
    是一个月的第1天到第31天
  • T
    以字面形式出现在字符串中,以指示时间元素的开始
  • HH
    是从午夜开始经过的完整小时数,为从00到24的两位十进制数字
  • (冒号)在字符串中出现两次
  • mm
    是从一小时开始算起的完整分钟数,为从00到59的两位十进制数字
  • ss
    是一分钟开始后的完整秒数,为0到59之间的两位十进制数字
  • (点)按字面意思显示在字符串中
  • sss
    是从第二个十进制数字开始的完整毫秒数
  • Z
    是指定为“Z”(UTC)或“+”或“-”后跟时间表达式的时区偏移量
    HH:mm
该规范还指出,如果“字符串不符合[指定的]格式,函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式”,这可能会导致不同浏览器中的不同日期

ECMAScript不考虑任何用户本地日期时间格式,这意味着您不能使用特定于国家或地区的日期时间格式

短日期(和时间)表格 本规范还包括以下较短的格式

此格式包括仅限日期的表格:

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD
它还包括“日期-时间”表格,该表格由上述仅限日期的表格之一组成,紧跟其后的是以下带有可选时区偏移的时间表格之一:

  • THH:mm
  • THH:mm:ss
  • THH:mm:ss.sss
回退值 […]如果缺少
MM
DD
字段
new Date().toISOString() // "2018-08-05T20:19:50.905Z"
function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}
2018
2018-01
2018-01-01
2018-01-01T00:00
2018-01-01T00:00:00
2018-01-01T00:00:00.000
2018-01-01T00:00:00.000Z
2018-01-01T00:00:00.000+01:00
2018-01-01T00:00:00.000-01:00
+002018-01-01T00:00:00.000+01:00
2018-1-1 // month and date must be two digits
2018-01-01T0:0:0.0 // hour/minute/second must be two digits, millisecond must be three digits
2018-01-01 00:00 // whitespace must be "T" instead
2018-01-01T00 // shortest time part must have format HH:mm
2018-01-01T00:00:00.000+01 // time zone must have format HH:mm
Sun Feb 03 2019 14:27:49 GMT+0100 (Central European Standard Time)
Sun, 03 Feb 2019 13:27:49 GMT