Search code examples
javazoneddatetime

Compare ZoneDateTime with different time zones


Hi I've already search for similar questions but without luck. I'm calling a ws that sends me back a token and when it's valid example:

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

I know that this dates are GMT+2 (Rome), now I'm taking the current time and convert the two strings:

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);
}

Now locally everthing is working fine, when i deploy on cloud i get:

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

two hours behind.

How can i solve this without adding two hours to currentTime? (doing like this locally will not work)

Regards


Solution

  • GMT+2 is an offset, Middle Europe +1 hour plus 1 hour summer time. That would go wrong in the coming winter. In fact you are using the incomplete OffsetDateTime, which without Locale is inconclusive for the real Zone.

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

    As you see, no need to revert to LocalDateTime.

    Now you can get currentTime.toInstant() for an absolute UTC number.

    An Instant is even Comparable, but Before/After is fine.

    You assume that before and after limits are also in the Italian time zone, but that may be as it is.

    There are some things to consider, because of DST (summer time, daylight savings time):

    • With a count down ("Still 243 hours till the end") you can get awkward jumps of 1 hour per day.
    • Twice a year there is the 02:00-03:00 gap or repetition (Western Europe). These stati can be queried.