2

考虑这个 SPARQL,其中 datetime 是公元前 36 年的日期:

SELECT ?date ?year WHERE {
  wd:Q1180731 wdt:P577 ?datetime .
  BIND(xsd:date(?datetime) AS ?date)
  # BIND(YEAR(?datetime) AS ?year)
}

xsd:date(?datetime)函数在 Wikidata 查询服务 Blazegraph 实例上失败,带有java.lang.IllegalArgumentException: -036-01-01T00:00:00Z.

它应该工作吗?与YEAR不抱怨的行(未注释时)。

我想出了这个变体:

SELECT ?date WHERE {
  wd:Q1180731 wdt:P577 ?datetime .
  BIND(REPLACE(STR(?datetime), 'T.*', '') AS ?date)
}

在这种情况下,结果是-036-01-01。此类 BC 日期的可排序性可能不好。我们是否有其他方法/函数可以使 1000 年之前的(字符串?)日期(包括 BC 日期)可排序?

4

1 回答 1

3

ISO 8601日期预计至少有四位数的年份(并且实现不愿意处理多于四位数的情况并非不为人知)。这意味着您的日期的文字字符串可能应该是'-0036-01-01',而不是'-036-01-01'

一些实现不愿意考虑 BCE 日期;这算作一种资源限制,类似于不愿意考虑超过10^10^10^10^10字节的字符串,所以值得的是,这是一个实现质量问题,而不是一致性问题。

请注意,如果您在认真地使用 BCE 日期,您将希望使用XSD 1.1,其中文字'-0036-01-01'表示(公历)公元前 37 年的一天,而不是公元前 36 年。(年份0000is 1 BCE-0001is2 BCE等)据 WG 中的任何人所知,在基督教时代之前的时期,公历日期的主要用途是在天文学家中,并且由于这种逐一的用法是他们的(由卡西尼号介绍为了简化日期计算),用-0036来表示确实不是一个好主意36 BCE

于 2017-11-30T00:22:11.307 回答