java - 比较不同时区的 ZoneDdateTime

您好,我已经搜索过类似的问题,但没有成功。 我正在调用一个 ws,它将一个 token 发回给我,当它是有效的示例时:

{
   "token": ...,
   "notBefore":"Thu 21 Jul 2022 at 10:50:43",
   "notOnOrAfter":"Thu 21 Jul 2022 at 12:50:43"
}

我知道这个日期是 GMT+2(罗马),现在我使用当前时间并转换两个字符串:

ZonedDateTime currentTime = LocalDateTime.now().atZone(ZoneId.of("GMT+2"));
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(token.getTimePattern(), Locale.ENGLISH);
ZonedDateTime tokenNotValidAfter = LocalDateTime.parse(token.getNotOnOrAfter(), dateTimeFormatter).atZone(ZoneId.of("GMT+2"));
ZonedDateTime tokenNotValidBefore = LocalDateTime.parse(token.getNotBefore(), dateTimeFormatter).atZone(ZoneId.of("GMT+2"));
if (!currentTime.isAfter(tokenNotValidBefore) || !currentTime.isBefore(tokenNotValidAfter)) {
    throw new CifTokenExpiredException(ExceptionHandlerConfig.CIF_TOKEN_EXPIRED);
}

现在本地一切正常,当我部署在云上时,我得到:

ZonedDateTime currentTime = LocalDateTime.now().atZone(ZoneId.of("GMT+2"));

晚了两个小时。

如何在不将 currentTime 增加两个小时的情况下解决这个问题? (在本地这样做是行不通的)

问候

最佳答案

GMT+2 是一个偏移量,中欧 +1 小时加 1 小时夏令时。 这在即将到来的冬天会出错。事实上,您使用的是不完整的 OffsetDateTime,如果没有 Locale,它对于真实区域是不确定的。

ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.of("Europe/Rome"));

如您所见,无需恢复为 LocalDateTime。

现在您可以获得绝对 UTC 数字的 currentTime.toInstant()

Instant 甚至是 Comparable,但 Before/After 没问题。

您假设之前和之后的限制也在意大利时区,但事实可能是这样。

由于 DST(夏令时,夏令时),有一些事情需要考虑:

  • 通过倒计时(“距离结束还有 243 小时”),您每天可以笨拙地跳 1 小时。
  • 每年有两次 02:00-03:00 间隔或重复(西欧)。这些统计数据是可以查询的。

https://stackoverflow.com/questions/73066914/

相关文章:

c++ - 如何使这个递归函数更快? (四叉树)

python - Pandas : Concat rows of a dataframe with

c++ - 尽管类型删除,是否可以使用静态多态性(模板)?

c++ - 优化静态字符串的字符串存储

python - 如果我更改了类中的函数名称,该函数会发生什么变化?

regex - 如果使用 linux 命令行工具在文本文件的下一行中满足条件,则替换换行符

c# - 处理没有并发的任务列表

java - 如何修复 java.lang.ClassNotFoundException : org

java - Maven:如何查找依赖项

sql - 甲骨文 SQL : SUM in first row with condition