gpt4 book ai didi

java - 比较不同时区的 ZoneDdateTime

转载 作者:行者123 更新时间:2023-12-05 09:27:01 25 4
gpt4 key购买 nike

您好,我已经搜索过类似的问题,但没有成功。我正在调用一个 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 间隔或重复(西欧)。这些统计数据是可以查询的。

关于java - 比较不同时区的 ZoneDdateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73066914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com