Vermeiden Pseudozeitzonen
Die 3-4 Brief Zeitzone Abkürzungen wie CST
sind nicht tatsächliche Zeit ersetzt Zonen. Sie sind nicht standardisiert. Sie sind nicht einmal einzigartig!
Ihr CST
könnte "China Standard Time" oder könnte "Central Standard Time" in Amerika sein, oder könnte etwas anderes sein. Es gibt keine Möglichkeit zu wissen, welche.
Ein anderes Beispiel: IST
könnte "India Standard Time" oder "Ireland Standard Time" oder andere bedeuten.
Eine zuverlässige Entschlüsselung dieser Pseudozonen ist nicht möglich. Die Joda-Time-Bibliothek hat eine weise Politik, die es sogar ablehnt, es zu versuchen. Leider machen die java.time-Klassen beim Parsen eine Schätzung, aber das Ergebnis ist möglicherweise nicht die Zone, die Sie erwarten.
Also nie diese nutzlosen Pseudo-Zonen verwenden. Verwenden Sie eine proper time zone name im Format continent/region
wie America/Chicago
, Asia/Kolkata
, Pacific/Auckland
.
Vermeiden Vermächtnis Datum Zeitklassen
Sie verwenden die lästigen alten Datum-Zeit-Klassen, die jetzt Vermächtnis sind, die von den java.time Klassen verdrängte.
Umgehung
Wenn Sie wissen alle Eingaben für die gleiche Zeitzone bestimmt sind, abreißen dann die pseudo-Zone und Verfahren als LocalDateTime
gelten die vorgesehene Zone als ZoneId
ein ZonedDateDate
herzustellen. Von diesem können Sie eine Instant
für UTC Zeit extrahieren.
String input = "01-19-2017 06:01".replace(" " , "T") ; // Insert a “T” to comply with standard ISO 8601 format used by default in java.time.
LocalDateTime ldt = LocalDateTime.parse(input); // Lacks any concept of time zone or offset-from-UTC. So *not* an actual moment on the timeline.
ZoneId z = ZoneId.of("America/Chicago"); // Assuming “CST” meant this zone in North America.
ZonedDateTime zdt = ldt.atZone(z); // Assign a time zone to determine an actual moment on the timeline.
Instant instant = zdt.toInstant(); // Extract a value in UTC.
Sie können wählen, dass die selben Moment durch die Linse der Wandtaktzeit in Indien zu sehen.
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant(ZoneId.of("Asia/Kolkata")) ;
Verlassen Sie sich nie auf Standardzone
Ihre aktuelle Standard-Zeitzone des JVM kann innerhalb dieser JVM ausgeführt wird in jedem Thread von jeder App von jedem Code jederzeit geändert werden.Da sich dies jederzeit ändern kann, können Sie sich nicht auf einen bestimmten Wert verlassen.
Wenn Sie das optionale Argument für die Zeitzone weglassen, wenden die Datums- und Uhrzeitklassen implizit die aktuelle Standardzeitzone an. Die Lösung ist einfach: Geben Sie immer die erwartete/gewünschte Zeitzone an.
Beachten Sie, wie das obige Codebeispiel die Zone bei jeder Gelegenheit angibt.
(Das Gleiche gilt für Locale
, übrigens. Explizit angeben, anstatt auf aktuellen Standard verlassen.)
* „Tue 19. Januar 06.01.00 CST 2016 -> Wenn die Systemzeit ist Shanghai Zeit“ * <- Ist das nur ein Tippfehler oder ist es wirklich das Jahr ändern bis 2016? –
Was meinst du mit "24 Stunden" hier? Beachten Sie, dass Sie "hh" (die 12-Stunden-Uhr) sowohl in der Eingabe als auch in der Ausgabe verwenden ... –
Beachten Sie auch, dass viele Zeitzonenabkürzungen schrecklich mehrdeutig sind. Was erwarten * Sie * CST in diesem Fall? –