2

(编辑:我在下面的代码中使用 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()?

4

5 回答 5

2

看看这个页面。您正在传递一个传递给此解析方法的字符串。除非您传递 3 个整数,否则第一个参数不是“年”。最后,虽然类本身没有被弃用,但它的一些成员是(包括getYear()哪些被getFullYear()你正在使用的替换)

于 2012-09-14T21:30:10.693 回答
2

正如其他答案所暗示的那样,您不能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.jsDatejs都可能有所帮助,但我怀疑它们都不能很好地处理古代。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 中,这适用于字符串和整数。

您可能还对gregorianTimemap.js 库中的解析器感兴趣,它处理带有 AD、CE、BC 和 BCE 扩展的古代年份以及负数。

于 2012-09-14T21:32:53.447 回答
1

这个小提琴 在 Firefox 上另有说明。也许它与浏览器有关?

于 2012-09-14T21:26:31.103 回答
0

alert(new Date('999').getFullYear());NaN在 Firefox 15.0.1 上产生

嗯.. Chrome 21.0.1180.57 确实产生“999”

于 2012-09-14T21:28:13.677 回答
0
var x = new Date('10000').getFullYear()

将其更改为

var x = new Date(10000).getFullYear()

您正在向invalid datestring日期构造函数发送一个。

于 2012-09-14T21:34:47.930 回答