{"id":12242,"date":"2018-12-10T19:48:25","date_gmt":"2018-12-10T18:48:25","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=12242"},"modified":"2021-11-22T17:14:08","modified_gmt":"2021-11-22T16:14:08","slug":"java-8-quickie-zeitzonen-umwandlung-mit-zoneddatetime-utc-nach-europas-zeitzone","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=12242","title":{"rendered":"Java 8 Quickie: Zeitzonen Umwandlung mit ZonedDateTime: UTC  nach Europas Zeitzone"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/03\/Zeitumstellung-ziehen-1024x768.png\" alt=\"\" class=\"wp-image-9808\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/03\/Zeitumstellung-ziehen-1024x768.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/03\/Zeitumstellung-ziehen-300x225.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/03\/Zeitumstellung-ziehen-768x576.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption>Zeitzonen<\/figcaption><\/figure>\n\n\n\n<p>Manchmal hat man Zeitangaben z.B. aus IOT Ger\u00e4ten in der Form eines Strings &#8222;<strong>2018-12-10 12:14:15 UTC&#8220;.<\/strong> Nun m\u00fcssen die Zeitangaben die in UTC verwendet werden in die lokale Zeitzone f\u00fcr Europa\/Berlin umgewandelt werden. Das ist in der Regel eine Stunde plus. Wie geht das aber mit der Java 8 API? <br><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Also erst mal einen JUnit Test daf\u00fcr schreiben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Test\npublic void testDatumZeitUTC() {\n\n                String eingagsZeitpunktUTC = \"2018-12-10 12:14:15 UTC\";\n\n\t\tassertEquals(13, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getHour()); \/\/ da eine Stunde Plus\n\t\tassertEquals(14, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMinute());\n\t\tassertEquals(15, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getSecond());\n\n\t\tassertEquals(\"Europe\/Berlin\", Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getZone().getId()); \/\/ Zeitzone\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ nicht\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ mehr UTC\n\t\tassertEquals(10, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getDayOfMonth()); \/\/ Tag\n\t\tassertEquals(12, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMonthValue()); \/\/ Achtung! Monat der Wert,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ nicht getMonth!\n\t\tassertEquals(2018, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getYear());\n\t}\n\n\t@Test\n\tpublic void testDatumZeitUTCNextDay() {\n\n\t\tString eingagsZeitpunktUTC = \"2018-12-10 23:14:15 UTC\";\n\n\t\tassertEquals(0, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getHour()); \/\/ da eine Stunde Plus\n\t\tassertEquals(14, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMinute());\n\t\tassertEquals(15, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getSecond());\n\n\t\tassertEquals(\"Europe\/Berlin\", Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getZone().getId()); \/\/ Zeitzone\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ nicht\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ mehr UTC\n\t\tassertEquals(11, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getDayOfMonth()); \/\/ ein Tag weiter\n\t\tassertEquals(12, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getMonthValue()); \/\/ Achtung! Monat der Wert,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ nicht getMonth!\n\t\tassertEquals(2018, Zeit.getZonedDateTimeFromUTC(eingagsZeitpunktUTC).getYear());\n\t}<\/code><\/pre>\n\n\n\n<p>So, das sind die beiden Testmethoden, nun die eigentliche Klasse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class Zeit {\n\n\t\/**\n\t * Liefer die Zeitzone mit Datum und Uhrzeit aus einem UTC String. Umgerechnet\n\t * auf Europa (+1 Stunde).\n\t * \n\t * Die Koordinierte Weltzeit (UTC) ist keine Zeitzone, sondern ein Zeitstandard\n\t * f\u00fcr die Berechnung von Ortszeiten in Zeitzonen weltweit. Veraltet: (aber\n\t * gleiche wie UTC) Greenwich Mean Time (GMT) ist eine Zeitzone. Sie orientiert\n\t * sich an der UTC und wird heute in mehreren L\u00e4ndern noch offiziell verwendet,\n\t * darunter Gro\u00dfbritannien.\n\t * \n\t * @param eingagsZeitpunktUTC in der Form yyyy-MM-dd HH:mm:ss UTC z.B.\n\t *                            2018-12-10 12:00:00 UTC\n\t * @return die ZonedDateTime auf Europa umgerechnet (+1 Stunde) z.B. 2018-12-10\n\t *         13:00:00 Europa\/Berlin\n\t *\/\n\tpublic static ZonedDateTime getZonedDateTimeFromUTC(String eingagsZeitpunktUTC) {\n\n\t\tDateTimeFormatter formatter = DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss 'UTC'\");\n\n\t\tLocalDateTime dateTimeUTC = LocalDateTime.parse(eingagsZeitpunktUTC, formatter);\n\n\t\tZonedDateTime inputUTC = ZonedDateTime.of(dateTimeUTC, ZoneId.of(\"UTC\"));\n\n\t\tZonedDateTime lokalEuropa = inputUTC.withZoneSameInstant(ZoneId.of(\"Europe\/Berlin\")); \/\/ UTC in Europa Zeitzone\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ konvertieren\n\n\t\treturn lokalEuropa;\n\t}\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Manchmal hat man Zeitangaben z.B. aus IOT Ger\u00e4ten in der Form eines Strings &#8222;2018-12-10 12:14:15 UTC&#8220;. Nun m\u00fcssen die Zeitangaben die in UTC verwendet werden in die lokale Zeitzone f\u00fcr Europa\/Berlin umgewandelt werden. Das ist in der Regel eine Stunde plus. Wie geht das aber mit der Java 8 API?<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,5,1361],"tags":[2178,3464],"class_list":["post-12242","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java","category-java-8","tag-java","tag-zeitzonen"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/12242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12242"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/12242\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12242"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}