考虑这个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日期)之前制作(字符串?)日期?
答案 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
,-0001
为2 BCE
等。)至于工作组中的任何人都知道,在基督徒之前的时期主要使用公历日期时代是天文学家之一,由于这种逐一使用是他们的(由卡西尼引入以简化日期计算),使用-0036
来表示36 BCE
真的不是一个好主意。