Neo4j 日期时间和iso格式
有时,toString(datetime())返回不带前导零的毫秒,以达到3的长度(yyyy-MM-dd'HH:MM:ss.SSSXXX)。这是错误还是正常行为 例如:Neo4j 日期时间和iso格式,neo4j,cypher,spring-data-neo4j,Neo4j,Cypher,Spring Data Neo4j,有时,toString(datetime())返回不带前导零的毫秒,以达到3的长度(yyyy-MM-dd'HH:MM:ss.SSSXXX)。这是错误还是正常行为 例如: RETURN apoc.temporal.format(datetime("2019-11-21T22:04:19.13Z"), 'iso_instant'); 2019-11-21T15:59:22.53Z->应该是2019-11-21T15:59:22.053Z 2019-11-21T15:59:21.216Z->OK
RETURN apoc.temporal.format(datetime("2019-11-21T22:04:19.13Z"), 'iso_instant');
- 2019-11-21T15:59:22.53Z->应该是2019-11-21T15:59:22.053Z
- 2019-11-21T15:59:21.216Z->OK
- 2019-11-21T15:30:09.042Z->正常
RETURN apoc.temporal.format(datetime("2019-11-21T22:04:19.13Z"), 'iso_instant');
将返回:
"2019-11-21T22:04:19.130Z"
[更新]
由于TOSTRING()
函数未被记录为返回datetime
的任何特定ISO 8601字符串格式,因此不应依赖于它返回特定格式,甚至不应跨版本返回相同datetime
的相同字符串
但是,如果您希望非APOC方法适用于neo4j的最新版本(如3.5.12,在其上进行了测试),下面是一个将当前TOSTRING()
输出字符串修改为始终具有3位毫秒值的方法示例:
// Generate a string.
// You can play with the number of digits after ".", and
// even eliminate the "." and any following digits.
WITH TOSTRING(datetime("2019-11-21T22:04:10.1Z")) AS d
// Always return a 3-digit millisecond time in result
WITH d, LENGTH(d) AS lth
RETURN d, CASE WHEN lth < 24
THEN SUBSTRING(d, 0, lth-1) + SUBSTRING('.000Z', lth - 20)
ELSE d END AS result
//生成一个字符串。
//您可以在“.”之后播放数字,和
//甚至删除“.”和以下任何数字。
将TOSTRING(日期时间(“2019-11-21T22:04:10.1Z”)作为d
//结果中始终返回3位毫秒时间
带d,长度(d)为lth
当lth<24时返回d
然后子串(d,0,lth-1)+子串('.000Z',lth-20)
否则,我们将以失败告终
我想你的意思是尾随零-否?(即2.53)您下面的示例有一个前导零9.042,我的意思是,有时小于100毫秒的0会丢失。为什么您认为它应该是…2.053而不是…2.530?因为我想530会正确返回。我正在寻找一个没有apoc的解决方案。此外,我想知道为什么toString(datetime())具有这种行为。toString()
函数没有文档记录来为datetime
返回任何特定的ISO 8601字符串格式,因此如果需要特定的格式,您不应该依赖它。因此,没有apoc,就没有办法获得iso格式的日期吗?我已经更新了我的答案,显示了一个解决方法,但有一个警告。