同名短时区ID对应不同时区,如何断言ZonedDateTime日期相等?
解决ZonedDateTime因时区ID不同导致的断言失败问题
你遇到的问题根源在于PST是时区缩写,并非唯一的时区标识符——不同系统的时区映射规则可能将其关联到America/Los_Angeles、America/Tijuana等不同的ZoneId,但这些时区在目标时间点的偏移量都是-08:00,实际代表的是同一个时间点。以下是几种可行的断言方式:
方法一:比较瞬时时间(Instant)
直接将ZonedDateTime转换为Instant(UTC标准时间),只要两个时间点一致就判定相等,完全忽略时区ID的差异:
assertTrue(d.toInstant().equals(expectedDate.toInstant()));
方法二:比较本地日期时间+时区偏移量
分别验证LocalDateTime(日期时间部分)和ZoneOffset(时区偏移量)是否一致,这样既保证时间点正确,也能确保时区偏移符合预期:
assertEquals(d.toLocalDateTime(), expectedDate.toLocalDateTime()); assertEquals(d.getOffset(), expectedDate.getOffset());
方法三:统一使用固定时区规则
如果需要从根源避免时区ID不一致的问题,可以在解析和构造日期时,明确指定唯一的时区ID或直接使用时区偏移量:
方式1:指定固定时区ID
// 解析时绑定固定时区 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("H:m:s MMM d, uuuu z") .withZone(ZoneId.of("America/Los_Angeles")); ZonedDateTime d = ZonedDateTime.parse(nextPaymentDate, formatter); // 构造预期日期时使用同一时区 ZonedDateTime expectedDate = ZonedDateTime.of(2023, 2, 5, 2, 0, 0, 0, ZoneId.of("America/Los_Angeles"));
方式2:直接使用时区偏移量
如果不需要关注具体时区ID,只需要偏移量正确,可以直接用ZoneOffset代替ZoneId:
// 解析时用偏移量(注意格式化器中的"z"会匹配偏移量或时区缩写,不影响) ZonedDateTime d = ZonedDateTime.parse(nextPaymentDate, DateTimeFormatter.ofPattern("H:m:s MMM d, uuuu z")); // 构造预期日期时直接指定偏移量 ZonedDateTime expectedDate = ZonedDateTime.of(2023, 2, 5, 2, 0, 0, 0, ZoneOffset.ofHours(-8));
内容的提问来源于stack exchange,提问作者KarloSpacapan
相关产品推荐
相关产品推荐

