2 votes

Résultats différents avec LocalDateTime par différents appels avec le même paramètre

Le problème est que je dois modifier mon code pour passer de l'objet Calendar à l'objet LocalDateTime. Mais je n'obtiens pas le même horodatage à la fin. Au premier appel, j'ai obtenu la même chose avec localDateTime, aux appels suivants, j'obtiens d'autres horodatages et j'utilise le même paramètre pour calculer les horodatages. Je ne sais pas pourquoi j'obtiens des résultats différents. Ce n'est pas logique pour moi. Ce que je veux faire, c'est : J'obtiens un horodatage UTC. Je veux le régler sur l'heure allemande (Europe/Berlin) (important pour les saisons d'été et d'hiver). Je veux ensuite calculer le début de la journée (00:00) et la fin de la journée (23:59). Je veux ensuite obtenir l'horodatage de ces heures.

Je construis une API avec spring-boot. La fonction décrite ci-dessus est invoquée par une classe contrôleur de spring-boot. Le premier appel après le démarrage de l'API calcule les résultats attendus. Mais tous les appels suivants donnent d'autres résultats. Toujours avec une différence de 7200. J'ai essayé d'autres méthodes avec localDateTime, mais cela ne donne jamais le même horodatage qu'avec le calendrier.

LocalDateTimeWay :

LocalDateTime localDateTime = 
LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
LocalDateTime dayStartLocal = localDateTime.withHour(0)
    .withMinute(0)
    .withSecond(0)
    .withNano(0);

ZonedDateTime startZonedDateTime = dayStartLocal.atZone(ZoneId.systemDefault());
long dayStartTimeStamp = startZonedDateTime.toInstant().getEpochSecond();

LocalDateTime dayEndLocal = localDateTime.withHour(23)
    .withMinute(59)
    .withSecond(59)
    .withNano(999);

ZonedDateTime endZonedDateTime = dayEndLocal.atZone(ZoneId.systemDefault());
long dayEndTimeStamp = endZonedDateTime.toInstant().getEpochSecond();

CalendarWay :

Calendar cal=Calendar.getInstance();
cal.setTimeInMillis(timestamp*1000);
cal.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
long dayStartTimeStamp = calendar.getTimeInMillis()/1000L;

cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE,59);
cal.set(Calendar.SECOND,59);
cal.set(Calendar.MILLISECOND,999);

long dayEndTimeStamp = calendar.getTimeInMillis()/1000L;

Je veux par le paramètre timestamp 1536933600. Le résultat 1536876000 et 1536962399. Mais j'obtiens après la première demande par la méthode localDateTime 1536883200 et 1536969599.

4voto

Karol Dowbecki Points 27852

Vous utilisez la zone par défaut du système pour votre java.time et la zone Europe/Berlin pour le code Calendar code. Le site 7200 est très probablement la différence entre le fuseau horaire de votre système et l'Europe/Berlin (2 heures).

Remplacer tous les ZoneId.systemDefault() avec ZoneId.of("Europe/Berlin") et vous obtiendrez les mêmes valeurs dans les deux versions :

timestamp = 1536933600
dayStartTimeStamp = 1536876000
dayEndTimeStamp = 1536962399

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X