考虑此sparql,其中日期时间是36 BC的日期:
SELECT ?date ?year WHERE {
wd:Q1180731 wdt:P577 ?datetime .
BIND(xsd:date(?datetime) AS ?date)
# BIND(YEAR(?datetime) AS ?year)
}
使用java.lang.IllegalArgumentException: -036-01-01T00:00:00Z
的Wikidata查询服务BlazeGraph实例上的xsd:date(?datetime)
函数失败。
应该可以工作吗?使用YEAR
的行不抱怨(未注册时)。
我提出了这种变化:
SELECT ?date WHERE {
wd:Q1180731 wdt:P577 ?datetime .
BIND(REPLACE(STR(?datetime), 'T.*', '') AS ?date)
}
在这种情况下,结果是-036-01-01
。这种BC日期的可分解性可能不好。我们是否还有其他方法/函数可以制作(字符串?)1000年(包括卑诗省日期)的日期?
ISO 8601日期预计至少有四位数字(并且实施不愿意处理超过四位数并不尚不清楚)。这意味着您日期的文字字符串可能应该是'-0036-01-01'
,而不是'-036-01-01'
。
某些实现不愿意考虑BCE日期;这是一种资源限制,类似于不愿意考虑10^10^10^10^10
字节的字符串,因此,这是值得的,这是实施问题的质量,而不是符合性问题。
请注意,如果您完全认真使用BCE日期,您将想使用XSD 1.1,其中字面的'-0036-01-01'
表示每天(Gregorian)37公元前37年,而不是公元前36年。(0000
年是1 BCE
,-0001
是2 BCE
等),据WG中的任何人所知道的,在基督教时代之前的Gregorian Date的主要用途是天文学家,并且由于这种逐步使用的是他们的。(由卡西尼(Cassini)介绍以简化日期计算),使用-0036
表示36 BCE
。