Java 8 Quickie: Zeitzonen Umwandlung mit ZonedDateTime: UTC nach Europas Zeitzone

Erstellt am 10. Dezember 2018 von It_berater
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:

  1. Java 8 Quickie: Alle Zeitzonen mit getAvailableZoneIds mit Java ermitteln
  2. Java Quickie: Liefere die IP vom Domain Namen
  3. Java Quickie: Ist eine Domain erreichbar?