Javascript Date为什么接受非数字字符作为年份并返回2001?
如果您运行以下程序:
new Date('aaaa-05-04');
则产生CCD_ 1。aaaa
年不应该产生Invalid Date
吗?通过将年份设置为b
、abc
或任何其他组合,可以获得相同的结果。
此外,将月份设置为非数字会给出有效的日期
new Date('aaaa-aa-01');
但如果日期设置为21:,则不会
new Date('aaaa-aa-21');
奖金问题:
new Date(1950, 30, 30);
Wed Jul 30 1952 00:00:00 GMT+0100
中的结果
这不应该也导致Invalid Date
吗?相反,它增加了年份。
我目前正在使用Chrome 91。
不建议使用日期解析机制,因为它高度依赖于实现,例如,虽然new Date('aaaa-05-04');
将像您在chrome中描述的那样工作,但它将在firefox中产生无效的日期实例-在es5之前,情况更为糟糕。
该标准规定,如果格式与标准格式不匹配(ISO 8601的简化(,则实现可能会根据特定于实现的详细信息进行解析。
日期解析机制无法修复,这就是为什么tc39正在研究Temporal,这是一个用于解析和手动处理日期的新接口的提议。
最终,当传递的格式与标准格式不一致时,告诉Date.parse如何工作的唯一方法是检查实现的源代码:(
这就是所谓的"未定义行为";。JavaScript规范规定了必须解析哪些格式,但如果出现其他内容,实现可以自由地做其他事情,包括猜测是否选择不抛出异常返回无效的Date对象(不表示有效的时间点(。各种浏览器可能希望与它们(或其他浏览器(在以前版本中所做的事情兼容,因此它们可能有猜测的方法,也会为没有意义的输入产生值。甚至可能是规范中存在漏洞,允许出现一些奇怪的事情,在这种情况下,可以保留行为以实现向后兼容性。
如果要严格解析,请确保输入完全符合格式,或者使用日期解析库。
(至于奖金问题,在月底添加天数或在年底添加月份是对没有用添加的天数返回新日期等功能的替代。这是JavaScript规范中定义的一部分。(
为什么Javascript Date接受非数字字符作为年份并返回2001?如果运行以下操作:
new Date('aaaa-05-04');
当没有提供年份时,Google Chrome将日期对象默认为2001年
同时将月份设置为非数字会给出有效日期
Fri May 04 2001 00:00:00 GMT+0200
0
Date构造函数忽略字符串的aaaa-aa部分,但当它将-01视为日期字符串的第一个有效部分时,它会假设此子字符串必须是YYYY-MM-DD日期字符串的MM。
但如果day设置为21:
new Date('aaaa-aa-21');
Date构造函数首先将YYYY默认为2001,并将-21部分处理为月份,导致日期无效