Zeitzonen
Manchmal hat man Zeitangaben z.B. aus IOT Geräten in der Form eines Strings „2018-12-10 12:14:15 UTC“. Nun müssen die Zeitangaben die in UTC verwendet werden in die lokale Zeitzone für Europa/Berlin umgewandelt werden. Das ist in der Regel eine Stunde plus. Wie geht das aber mit der Java 8 API? Also erst mal einen JUnit Test dafür schreiben:
@Test
public void testDatumZeitUTC() {
String eingagsZeitpunktUTC = "2018-12-10 12:14:15 UTC";
assertEquals(13, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getHour()); // da eine Stunde Plus
assertEquals(14, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMinute());
assertEquals(15, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getSecond());
assertEquals("Europe/Berlin", Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getZone().getId()); // Zeitzone
// nicht
// mehr UTC
assertEquals(10, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getDayOfMonth()); // Tag
assertEquals(12, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMonthValue()); // Achtung! Monat der Wert,
// nicht getMonth!
assertEquals(2018, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getYear());
}
@Test
public void testDatumZeitUTCNextDay() {
String eingagsZeitpunktUTC = "2018-12-10 23:14:15 UTC";
assertEquals(0, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getHour()); // da eine Stunde Plus
assertEquals(14, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMinute());
assertEquals(15, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getSecond());
assertEquals("Europe/Berlin", Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getZone().getId()); // Zeitzone
// nicht
// mehr UTC
assertEquals(11, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getDayOfMonth()); // ein Tag weiter
assertEquals(12, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMonthValue()); // Achtung! Monat der Wert,
// nicht getMonth!
assertEquals(2018, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getYear());
}
So, das sind die beiden Testmethoden, nun die eigentliche Klasse:
public class Zeit {
/**
* Liefer die Zeitzone mit Datum und Uhrzeit aus einem UTC String. Umgerechnet
* auf Europa (+1 Stunde).
*
* Die Koordinierte Weltzeit (UTC) ist keine Zeitzone, sondern ein Zeitstandard
* für die Berechnung von Ortszeiten in Zeitzonen weltweit. Veraltet: (aber
* gleiche wie UTC) Greenwich Mean Time (GMT) ist eine Zeitzone. Sie orientiert
* sich an der UTC und wird heute in mehreren Ländern noch offiziell verwendet,
* darunter Großbritannien.
*
* @param eingagsZeitpunktUTC in der Form yyyy-MM-dd HH:mm:ss UTC z.B.
* 2018-12-10 12:00:00 UTC
* @return die ZonedDateTime auf Europa umgerechnet (+1 Stunde) z.B. 2018-12-10
* 13:00:00 Europa/Berlin
*/
public static ZonedDateTime getZonedDateTimeFromUTC(String eingagsZeitpunktUTC) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss 'UTC'");
LocalDateTime dateTimeUTC = LocalDateTime.parse(eingagsZeitpunktUTC, formatter);
ZonedDateTime inputUTC = ZonedDateTime.of(dateTimeUTC, ZoneId.of("UTC"));
ZonedDateTime lokalEuropa = inputUTC.withZoneSameInstant(ZoneId.of("Europe/Berlin")); // UTC in Europa Zeitzone
// konvertieren
return lokalEuropa;
}
}
Ähnliche Artikel:
- Java 8 Quickie: Alle Zeitzonen mit getAvailableZoneIds mit Java ermitteln
- Java Quickie: Liefere die IP vom Domain Namen
- Java Quickie: Ist eine Domain erreichbar?
