应该xsd:date转换为SPARQL中常见时代之前的日期时间

时间:2017-11-29 22:14:33

标签: date datetime xsd sparql wikidata

考虑这个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)的维基数据查询服务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日期)之前制作(字符串?)日期?

1 个答案:

答案 0 :(得分:3)

ISO 8601日期预计一年至少有四位数(并且实现不愿意处理超过四位数的情况并不是未知)。这意味着您日期的文字字符串应该是'-0036-01-01',而不是'-036-01-01'

有些实施不愿意考虑BCE日期;这被视为一种资源限制,类似于不愿意考虑超过10^10^10^10^10字节的字符串,因此对于它的价值而言,这是一个实施质量问题,而不是一致性问题。

请注意,如果您严重使用BCE日期,则需要使用XSD 1.1,其中文字'-0036-01-01'表示公历37(公历)中的一天,而不是公元前36年。 (0000年为1 BCE-00012 BCE等。)至于工作组中的任何人都知道,在基督徒之前的时期主要使用公历日期时代是天文学家之一,由于这种逐一使用是他们的(由卡西尼引入以简化日期计算),使用-0036来表示36 BCE真的不是一个好主意。