javascript - javascript Date 函数只有几年是怎么回事?

标签 javascript date

(编辑:我使用 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.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 中,这适用于字符串和整数。

您可能还对 gregorian parser in the Timemap.js library 感兴趣,它处理带有 AD、CE、BC 和 BCE 扩展名的古代年份,以及负数。

关于javascript - javascript Date 函数只有几年是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432184/

相关文章:

javascript - Firebase 的云函数 : Increment Counter

javascript - 仅当之前未使用 jQuery 添加过的元素时,才在一组元素之后添加元素

java - LocalDate 上个月的最后一个工作日

java - 如何将 java.sql.Date 对象转换为 GregorianCalendar?

java - 将日期从 GMT 时区转换为本地时区——使用 ISO_OFFSET_DATE_TIME

python - 使用 pandas 在 python 中动态解析日期为日期时间

javascript - 使用 Click 或 Escape 键调用 setState

javascript - 了解Jquery回调函数

Html Css 更改日期输入高亮颜色

javascript - 如果我在下拉列表中选择否,如何禁用按钮