2017-05-16 4 views
4

ich jetzt dieses Stück Code in Paris leite, wo seine 12:40, wo ECT = ECT - Europe/ParisZoneID und Local

LocalDateTime creationDateTime = LocalDateTime.now(Clock.systemUTC());  
ZoneId zone = ZoneId.of(ZoneId.SHORT_IDS.get("ECT")); 


System.out.println ("creationDateTime --------------------------> " + creationDateTime);   
System.out.println ("creationDateTime.atZone(zone).getHour() ---> " + creationDateTime.atZone(zone).getHour()); 
System.out.println ("creationDateTime.atZone(zone).getMinute() -> " + creationDateTime.atZone(zone).getMinute()); 

Aber ich dies an der Konsole bin immer

creationDateTime --------------------------> 2017-05-16T10:40:07.882 
creationDateTime.atZone(zone).getHour() ---> 10 
creationDateTime.atZone(zone).getMinute() -> 40 

Soll ich nicht 12:40 ???????

Antwort

7

Nein, sollten Sie nicht. Sie haben nach einem ZonedDateTime mit demselben LocalDateTime gefragt, mit dem Sie begonnen haben, der jedoch mit einer bestimmten Zeitzone verknüpft ist.

Aus der Dokumentation für LocalDateTime.atZone:

Dies gibt eine ZonedDateTime ab diesem Zeitpunkt Zeit bei der angegebenen Zeitzone gebildet. Das Ergebnis stimmt so genau wie möglich mit diesem Datum überein. Zeitzonenregeln, wie z. B. die Sommerzeit, bedeuten, dass nicht jedes lokale Datum und Uhrzeit für die angegebene Zone gültig ist. Daher kann das lokale Datum und die Uhrzeit angepasst werden.

In diesem Fall zur Anpassung nicht notwendig ist, weil 2017-05-16T10: 40: 07.882 taten in Paris auftreten.

Es klingt wie Ihr Fehler war eine LocalDateTime überhaupt zu erstellen. Du hast im Grunde gesagt: "Finde heraus, was die aktuelle Zeit in UTC ist, dann nimm dasselbe lokale Datum und Uhrzeit, aber tu so, als befände es sich in einer anderen Zeitzone."

Wenn es Ihr Ziel ist, die aktuelle Zeit in zone zu bekommen, sollten Sie keinen LocalDateTime überhaupt haben. Verwenden Sie einfach:

ZonedDateTime zonedNow = ZonedDateTime.now(Clock.system(zone)); 

oder (äquivalent)

ZonedDateTime zonedNow = Clock.systemUTC().instant().atZone(zone); 
0

Diese Methode ein ZonedDateTime zurückgibt, nicht ein modifiziertes LocalDateTime. In diesem Fall gibt es also eine ZonedDateTime, die 2017-05-16 10:40 in der Zeitzone ETC darstellt.