JavaScript短日期格式中是否可以使用 "-" 代替 "/"?

5
在W3Schools网站上,他们展示了使用“/”输入短日期格式的方法,如下所示:new Date("03/25/2015")。我尝试将“/”替换为“-”,如下所示:new Date("03-25-2015"),这也可以工作。然而,在阅读网站时,我没有发现这被提及为有效的替代方法。

它是有效的吗?即使它起作用,我是否应该使用正斜杠而不是横线?


1
简短回答:没有人使用“m-d-y”。如果您想使用MDY,请使用斜杠。如果您想使用破折号,请使用DMY。不信?那么这个日期是什么:“03-04-2015”?三月四日?还是四月三日? - zessx
4个回答

1
如果你在Firefox中尝试使用new Date("03-25-2015"),会得到一个"无效日期"的提示。因此,使用破折号在所有浏览器中都不起作用。最好使用正斜杠(/)。同样适用于日期之间的句点,new Date("03.25.2015")在Firefox中无效,但在Chrome中有效。

1
PS:W3Schools并不像你想象的那样准确。我建议使用MDN(Mozilla开发者网络)代替。(日期参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) - Mottie

1
根据ES5规范, 当Date构造函数传递一个字符串时,它会使用与Date.parse相同的逻辑:
  1. 将v设置为ToPrimitive(value)。
  2. 如果Type(v)是String,则

    a. 将v解析为日期,完全按照parse方法(15.9.4.2)的方式解析;让V成为这个日期的时间值。

Date.parse首先使用Date Time String格式,然后使用特定于实现的启发式算法:

该函数首先尝试按照Date Time String格式(15.9.1.15)中指定的规则解析字符串的格式。 如果字符串不符合该格式,则函数可能回退到任何特定于实现的启发式算法或特定于实现的日期格式。

日期时间字符串格式YYYY-MM-DDTHH:mm:ss.sssZYYYYYYYY-MMYYYY-MM-DD也是有效的。

正如Mottie所指出的那样,在Firefox中new Date("03-25-2015")会失败。然而,这只是部分原因是由于连字符。如果将年份移至前面(new Date("2015-03-25")),日期字符串将符合日期时间字符串,它就可以成功了。


0

来自 MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date

创建新的Date对象的方法之一是通过 new Date(dateString);。其中dateString被描述为:

表示日期的字符串值。该字符串应该是一个被 Date.parse() 方法(IETF-compliant RFC 2822 timestamps 和 ISO8601 的一种版本)所识别的格式。 注意:强烈不建议使用 Date 构造函数 (和 Date.parse,它们是等价的) 来解析日期字符串,因为浏览器差异和不一致性。

这种创建新的Date对象的方法使用了Date.parse()方法来解析dateString字符串。

来自 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

Date.parse()被定义为:

Date.parse()方法解析日期的字符串表示形式,并返回自1970年1月1日00:00:00 UTC以来的毫秒数,如果字符串无法识别或包含非法日期值(例如2015-02-31),则返回NaN。

ECMAScript 5 ISO-8601格式支持

日期时间字符串可以采用ISO 8601格式。例如,可以传递和解析"2011-10-10"(仅日期)或"2011-10-10T14:48:00"(日期和时间)。对于仅为ISO 8601日期的字符串,使用UTC时区来解释参数。如果字符串是ISO 8601格式的日期和时间,则将其视为本地时间。

因此,您使用的语法即new Date("03-25-2015")是有效的语法,但由于浏览器之间存在差异和不一致性,因此不建议使用。


0
当你有类似这样的问题时,通常应该直接去官方规范中寻找答案。在这种情况下,JavaScript 的官方规范是 EMCAScript 规范。
相关的部分如下:

http://www.ecma-international.org/ecma-262/6.0/#sec-date.parse

它说明:

Date.parse ( string )

[...]

该函数首先尝试根据日期时间字符串格式(20.3.1.16)中指定的规则(包括扩展年份)解析字符串的格式。如果字符串不符合该格式,则该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。

换句话说,所有实现都保证支持的唯一格式列在日期时间字符串格式(20.3.1.16)中。除此之外的任何格式可能会因实现而异,因此不应使用。

为了简化第20.3.1.16节,日期的唯一有效格式是YYYY-MM-DD。毫不奇怪,W3Schools在其示例中使用了无效格式。

JavaScript文档的另一种可选来源是Mozilla开发者网络(MDN)。它不是官方来源,但比W3Schools更高质量,并在文章底部包含指向官方来源的直接链接。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接