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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
@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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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; } } |