正如其他答案所暗示的那样,您不能Date.parse
跨浏览器依赖,特别是如果您处理的是公元 1000 年之前的日期。
就 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
Timemap.js 库中的解析器感兴趣,它处理带有 AD、CE、BC 和 BCE 扩展的古代年份以及负数。