Neo4j 日期时间和iso格式

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

有时,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
  • 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格式的日期吗?我已经更新了我的答案,显示了一个解决方法,但有一个警告。