不同时区偏移的Datetime如何比较?Neo4j 4.4.12异常咨询
Neo4j 4.4.12 datetime时区偏移比较矛盾问题解析
问题核心原因
Neo4j中datetime类型的直接相等判断(=)与duration.between()计算遵循完全不同的逻辑:
- 直接
=比较:校验datetime对象的所有显式属性(包括时分秒、时区偏移、时区标识等)是否完全一致,而非判断是否为同一时间瞬间。 duration.between():基于两个datetime对应的**时间戳(epochMillis)**计算时间差,仅关注时间代表的物理瞬间是否相同。
对示例的具体解释
你的三个查询结果完全符合上述逻辑:
示例查询1返回false:
d1(2022-11-01T08:00+01:00)的hour为8、offset为+01:00;d2(2022-11-01T07:00)未指定时区,默认使用UTC偏移(+00:00),hour为7。两者的显式属性不匹配,因此d1=d2返回false。示例查询2返回PT0S:
d1转换为UTC时间是2022-11-01T07:00:00+00:00,与d2的时间完全对应,两者的epochMillis(时间戳)完全相同。duration.between()基于时间戳计算,自然返回0秒间隔(PT0S)。查询3的字段差异验证:
你看到的hour、offset、timeZone字段不同,正是直接相等判断返回false的原因;而epochMillis相同,是duration.between()返回0的核心依据。
正确判断同一时间瞬间的方法
如果需要判断两个datetime是否代表同一物理时间,不要直接用=,而是选择以下方式:
- 比较两者的
epochMillis:WITH datetime("2022-11-01T08:00+01:00") AS d1, datetime("2022-11-01T07:00") AS d2 RETURN d1.epochMillis = d2.epochMillis - 使用
datetime.equals()方法(Neo4j 4.x及以上版本支持):WITH datetime("2022-11-01T08:00+01:00") AS d1, datetime("2022-11-01T07:00") AS d2 RETURN d1.equals(d2)
内容的提问来源于stack exchange,提问作者clandestino_bgd
相关产品推荐
相关产品推荐

