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?