在 JS 中从 Wikidata 解析 ISO-Date

Parsing ISO-Date from Wikidata in JS

如果日期也可以是B.C,那么解析Javascript日期的ISO字符串有什么可能性?
我有维基数据的日期,例如(但也可能是其他 ISO 格式):-0709-01-01T00:00:00Z

这对于 Date.parse 来说太落后了,甚至像 Luxon 或 Moment 这样的库在这里也无法对它做任何事情。
我希望能够查询所需时区的年、月、日、小时和分钟。

我现在可以通过创建一个正则表达式并用它解析字符串来做到这一点,但是由于有许多可能的变化,我看到了不包括所有内容的危险。
我也没有在互联网上找到可以处理所有问题的正则表达式。

有人知道我可以在这里使用的库或其他解决方案吗?

"-0709-01-01T00:00:00Z" 与 format defined in ECMA-262 不一致,因此解析依赖于实现。

根据 ECMA-262,如果年份有一个符号(即前面有 + 或 -),它必须使用 expanded year 格式并且有 6 位数字,例如

new Date('-000709-01-01T00:00:00Z')

至少在 Safari、Firefox 和 Chrome 中有效。

所以你可以自己解析字符串或者将年份扩展到6位。后者需要解析和重新格式化,所以你最好直接解析它并通过直接转到构造函数来避免内置解析器,例如

function parseUTC(d) {
  let [Y, M, D, H, m, s] = d.match(/\d+/g);
  let sign = /^-/.test(d)? -1 : 1;
  return new Date(Date.UTC(sign*Y, M-1, D, H, m, s));
}

let d = '-0709-01-01T00:00:00Z';

// -000709-01-01T00:00:00.000Z
console.log(parseUTC(d).toISOString());

// Alternatively…
console.log(new Date(d.replace(/^-/,'-00')).toISOString());

虽然第二种方法“有效”,但我认为第一种方法更可靠,因为它不依赖于年份中的位数,而第二种方法假设它是 4 位数并且不处理“+2020” -10-23T00:00:00Z".