gpt4 book ai didi

javascript - 新日期无法解析 "31"但不是 "32"

转载 作者:行者123 更新时间:2023-11-29 16:44:26 25 4
gpt4 key购买 nike

我正在玩 Date 以尝试从 2 位数的年份中获得完整的年份,但我发现有些不一致:

$ new Date("12")
Sat Dec 01 2001 00:00:00 GMT+0000 (GMT)
$ new Date("13")
Invalid Date
$ new Date("31")
Invalid Date
$ new Date("32")
Thu Jan 01 2032 00:00:00 GMT+0000 (GMT)
$ new Date("99")
Fri Jan 01 1999 00:00:00 GMT+0000 (GMT)
$ new Date("999")
Tue Jan 01 999 00:00:00 GMT+0000 (GMT)

对这种胡说八道的任何合理解释。

浏览器是 OSX 上的 Chrome

最佳答案

由于所有这些都超出规范,因此允许 Chrome 退回到自己的启发式方法。这是一个很好的例子,说明为什么最好避免依赖未指定的行为。

new Date(string)Date.parse(string) 一样解析字符串。这是the spec说:

The function first attempts to parse the format of the String according to the rules (including extended years) called out in Date Time String Format (20.3.1.16). If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats.

所以,如果我们给它 "32" 或类似的东西,我们又不符合规范。

那么 Chrome 在做什么?或者更准确地说,V8 在做什么? 为此,我们必须 hit the source ,我在其中找到了这个方便的评论:

An unsigned number followed by ':' is a time value [snip]... Any other number is a date component and is added to DayComposer.

例如,它将采用 "12""31" 等,并尽可能找出它们是日期的哪一部分。这样做时,如果值小于 13,它似乎会尝试匹配月份,放弃 13-31(例如,可能是天的值),超过该值则匹配数年。

从您的示例中可以清楚地看出:

$ new Date("12")
Sat Dec 01 2001 00:00:00 GMT+0000 (GMT)

它决定 12 是一个月,并将年份默认为 2001。

$ new Date("13")
Invalid Date
$ new Date("31")
Invalid Date

在那个它无法弄清楚它是什么的范围内。

$ new Date("32")
Thu Jan 01 2032 00:00:00 GMT+0000 (GMT)

我们已经过了可能是一天的时间点,所以在本世纪现在已经持续了很多年。

$ new Date("99")
Fri Jan 01 1999 00:00:00 GMT+0000 (GMT)

上个世纪的年份;在两位数年份处理中相当常见,范围默认为 1900s,其余默认为 2000s。

$ new Date("999")
Tue Jan 01 999 00:00:00 GMT+0000 (GMT)

三位数,必须是年份,不需要推断世纪。

故事的寓意:坚持指定的输入格式,或者自己解析日期。 :-)

关于javascript - 新日期无法解析 "31"但不是 "32",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com