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

IT技术 javascript date format
2021-01-28 03:05:36

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

在第一个小时,分钟,秒都为零,而在第二个默认小时,分钟被设置为时区小时,分钟,即 5:30

2个回答

归结为如何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日凌晨12时在你的当前时区
您的第二个日期格式2015-03-31被视为 ISO-8601,并假定为UTC 时区2015 年 3 月 31 日凌晨 12 点

链接文档中的“假定时区的差异”有更详细的说明:

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

就像我在自己的回答中提到的那样,这只是部分正确:根据 ECMA,“2015/03/31”不是受支持的日期字符串。因此,由 JS 实现来决定如何处理它。许多浏览器将其解析为本地时区中的日期,但并非必须如此。例如 Safari 返回NaN
2021-03-19 03:05:36
请不要将引用从 MDN 复制到此处,因为 MDN 已更新,但此处的引用未更新。两个引用都包含已从 MDN 中更正或删除的错误。
2021-04-14 03:05:36

根据 ECMAScript 标准,第一个字符串“2015/03/31”是不受支持的格式。每当一个不受支持的值被传递给构造函数时,它的行为是依赖于实现的,即标准没有说明实现必须做什么。一些浏览器,如 Firefox,试图猜测格式是什么,显然它会在当地时间午夜创建一个具有该日期的日期对象其他浏览器可能会NaN以不同的方式返回或解释这些部分。

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