如何格式化BC日期(如"-700-01-01")?

Jos*_*ong 5 javascript date momentjs

如何使用Moment.js格式化ISO日期BC?

moment("-700-01-01").year();     // 700 (WRONG)
moment("-0700-01-01").year();    // 700 (WRONG)
moment("-000700-01-01").year();  // -700 (RIGHT)
Run Code Online (Sandbox Code Playgroud)

由于某种原因,一年有6位数的符号工作.这是"正确"的方式吗?为什么记法不像"-700-01-01"工作?

Jam*_*lly 6

这不是 Moment.js 特有的问题;如果您尝试Date()使用正在使用的字符串初始化对象,也会发生同样的情况。如果您Date()首先将其创建为对象并使用setYear()它手动分配年份,则接受日期为-700

var date = new Date();

date.setYear(-700);

moment(date).year();
Run Code Online (Sandbox Code Playgroud)
var date = new Date();

date.setYear(-700);

moment(date).year();
Run Code Online (Sandbox Code Playgroud)

然而,正如Niels Keurentjes 指出的那样,这么远的日期计算变得相当复杂,可能根本不可靠。

如果你想要“-700-01-01”,你可以分别配置年、月和日:

date.setYear(-700);
date.setMonth(0);
date.setDate(1);

console.log(date);
Run Code Online (Sandbox Code Playgroud)
> -700
Run Code Online (Sandbox Code Playgroud)

至于公元前 700 年第一个月的第一天是否真的是星期五……你必须自己查一查。

  • 谢谢,将日期创建为 `new Date(-700, 0, 1)` 确实很好用,但我需要一个可序列化的表示法,而 ISO 日期非常适合。您无法真正将 Moment.js 与默认的 Date 解析器进行比较,moment.js 提供了 Date 功能的超集并解决了浏览器之间的不兼容问题。所以我会说这是一个 moment.js 特定的问题,可以通过 moment.js 解决。关于为什么 6 位数年份有效的任何线索? (3认同)
  • 关于为什么 6 年数字有效的问题:http://scholarslab.org/research-and-development/parsing-bc-dates-with-javascript/ (2认同)