您好,我已经搜索过类似的问题,但没有成功。 我正在调用一个 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(夏令时,夏令时),有一些事情需要考虑:
https://stackoverflow.com/questions/73066914/