在 JS 中从 Wikidata 解析 ISO-Date

Posted

技术标签:

【中文标题】在 JS 中从 Wikidata 解析 ISO-Date【英文标题】:Parsing ISO-Date from Wikidata in JS 【发布时间】:2021-12-07 12:49:36 【问题描述】:

如果日期也可以是 B.C.,那么在 javascript 中解析日期的 ISO 字符串有哪些可能性? 例如,我有来自 Wikidata 的日期,看起来像这样(但其他 ISO 格式也是可能的):-0709-01-01T00:00:00Z

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

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

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

【问题讨论】:

【参考方案1】:

“-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"。

【讨论】:

以上是关于在 JS 中从 Wikidata 解析 ISO-Date的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 从 wikidata 转储中提取别名

如何在 Wikidata 上创建一个 SPARQL 查询,以获取所有具有 Project Gutenberg 电子书 ID 的书籍?

如何打开自定义 wikidata RDF 转储

通过 GPS 位置获取城市的 WikiData 标识符

wikidata研究和应用

Wikidata和SparQL简介