(编辑:我使用 Chrome 控制台来执行下面的代码)
我意识到 javascript Date() 已被弃用,但它对我当前正在处理的事情很有用;但是有一个奇怪的问题:
var x = new Date('999').getFullYear()
返回999
同时
var x = new Date('1000').getFullYear()
也返回 999,但是
var x = new Date('10000').getFullYear()
返回 10000...
有人知道为什么 4 位数字会给出错误的 .getFullYear() 吗?
最佳答案
正如其他答案所暗示的那样,您不能跨浏览器依赖 Date.parse
,特别是当您处理 1000 CE 之前的日期时。
就 Chrome 而言,问题似乎在于浏览器如何处理时区。以下示例表明,在公元 1000 年之前,Chrome 会在其之上解析您本地时区的日期; >= 1000 CE,它似乎首先解析 UTC 中的日期,然后应用时区转换:
> new Date('1000')
"Tue Dec 31 999 16:00:00 GMT-0800 (PST)"
> new Date('999')
"Tue Jan 01 999 00:00:00 GMT-0800 (PST)"
我倾向于将其视为一个错误,但也许 Chromium 团队认为这是一个功能:)。
底线是,如果您想要多年来(尤其是古代)的准确日期解析,您需要自己做一些工作和/或使用库。 Moment.js和 Datejs两者都可能有帮助,但我怀疑其中任何一个都能很好地处理古代。 Moment.js 似乎也有同样的问题(在 Chrome 中):
> moment('999').year()
999
> moment('1000').year()
999
据我所知,根据古代年份准确设置日期的最佳方法通常是 a) 始终使用 UTC,b) 手动设置日期:
var d = new Date();
d.setUTCFullYear('999');
d.getUTCFullYear(); // 999
d.setUTCFullYear('1000');
d.getUTCFullYear(); // 1000
至少在 Chrome 中,这适用于字符串和整数。
您可能还对 gregorian
parser in the Timemap.js library 感兴趣,它处理带有 AD、CE、BC 和 BCE 扩展名的古代年份,以及负数。
关于javascript - javascript Date 函数只有几年是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432184/