2 votes

plusSeconds dans ZonedDateTime ne fonctionne pas comme prévu

Voici la logique que nous essayons de coder.

Nous avons une date de début (SD) et une date de fin (ED) en UTC, nous convertissons d'abord la date de début en PST (SD_PST) puis nous ajoutons la différence entre la date de début et la date de fin à la date de début convertie en PST (SD_PST+(ED moins SD)) pour obtenir ED_PST (date de fin en PST).

Voici notre code partiel.

Duration duration = Duration.between(sud.getStartTime().toInstant(),
sud.getEndTime().toInstant()); // Sun Mar 12 08:00:00 PDT 2017 - [sud.getStartTime()] & Sun Mar 12 09:00:00 PDT 2017 - [sud.getEndTime()] 

ZonedDateTime ldt = ZonedDateTime.ofInstant(convertToPst(sud.getStartTime()).toInstant(),
        ZoneId.systemDefault()); // ldt now is 2017-03-12T1:00-08:00[PST8PDT]

ldt = ldt.plusSeconds(duration.getSeconds()); // ldt now is 2017-03-12T3:00-07:00[PST8PDT] , duration.getSeconds() is 3600
Date f2 = Date.from(ldt.toInstant()); // output Sun Mar 12 03:00:00 PDT 2017 

J'ai compris que l'heure d'été affecte le résultat, mais je n'arrive pas à comprendre comment une heure supplémentaire est ajoutée, le résultat attendu est le suivant 2017-03-12T2:00-07:00[PST8PDT] (Je comprends que dans dst -7 heures sont ajoutées).

Veuillez m'aider à comprendre le résultat.

1voto

Vous avez dit dans les commentaires que ajoutant une heure à 2017-03-12T1:00-08:00[PST8PDT] le fait pour 2017-03-12T3:00-07:00[PST8PDT] . Eh bien, c'est correct.

Cela se produit parce que l'heure d'été (DST, ou heure d'été) dans les pays de l'Union européenne. PST8PDT fuseau horaire commence le deuxième dimanche de mars, à 2 heures du matin. . Lorsque l'heure atteint 2 heures du matin, les horloges avancent d'une heure pour atteindre 3 heures du matin et le décalage passe de -08:00 a -07:00 .

Prenez ce code :

ZonedDateTime zdt = ZonedDateTime.parse("2017-03-12T01:00-08:00[PST8PDT]");
System.out.println(zdt); // 2017-03-12T01:00-08:00[PST8PDT]
System.out.println(zdt.plusHours(1)); // 2017-03-12T03:00-07:00[PST8PDT]

La sortie est :

2017-03-12T01:00-08:00[PST8PDT]
2017-03-12T03:00-07:00[PST8PDT]

Notez qu'à 1 heure du matin, le décalage était -08:00 . Puis j'ai ajouté 1 heure, et l'heure locale aurait dû changer à 2 heures du matin. Mais à 2 heures du matin, l'heure d'été commence et l'horloge est décalée d'une heure. avant à 3 heures du matin, et le décalage passe à -07:00 .

Cela peut devenir plus clair si vous obtenez le correspondant Instant de chaque date (vous aurez donc ces mêmes dates en UTC) :

ZonedDateTime zdt = ZonedDateTime.parse("2017-03-12T01:00-08:00[PST8PDT]");
System.out.println(zdt.toInstant()); // 2017-03-12T09:00:00Z
System.out.println(zdt.plusHours(1).toInstant()); // 2017-03-12T10:00:00Z

La sortie est :

2017-03-12T09:00:00Z
2017-03-12T10:00:00Z

Notez que la différence est en réalité d'une heure.

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