【问题标题】:How to format BC dates (like "-700-01-01")?如何格式化 BC 日期(如“-700-01-01”)?
【发布时间】:2023-04-06 22:25:02
【问题描述】:

如何使用 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)

由于某种原因,使用 6 位数字的年份表示法有效。这是“正确”的方式吗?为什么 "-700-01-01" 这样的符号不起作用?

【问题讨论】:

  • 作为一般规则,你不应该想要这个。根据定义,很久以前的日期计算将非常混乱和错误,因为当时的公历本身根本没有标准化。简而言之:根据 Moment.js 的日历逻辑,从来没有“1 月 1 日”,在公元前 700 年,唯一偶尔使用的日历是 Calendar of Numa,它每年计算 355 天。直到公元 1752 年,公历才远程可靠。
  • 实际这样做有几个原因 - 可能用户需要在“通常” javascript 工具制作的时间线上呈现一些数据,因此这个请求是完全有效的。没有人怀疑日期 BC 是不可靠的,当涉及到一周中的某天左右时,但仍然需要有办法做到这一点。世界并非始于 1.1.1970 ... :)

标签: javascript date momentjs


【解决方案1】:

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

var date = new Date();

date.setYear(-700);

moment(date).year();
> -700

但是作为Niels Keurentjes has pointed out,这么久以前的日期计算变得相当复杂,可能根本不可靠。

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

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

console.log(date);
> Fri Jan 01 -700 11:53:57 GMT+0000 (GMT Standard Time)

至于公元前 700 年 1 月 1 日是否真的是星期五……你得自己查一下。

【讨论】:

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

在您的示例中,减号也用作年、月和日之间的分隔符。正如您在詹姆斯回答的评论中指出的那样,使用逗号作为分隔符有助于区分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2017-12-28
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多