{"id":3872,"date":"2017-06-16T20:44:12","date_gmt":"2017-06-16T18:44:12","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3872"},"modified":"2017-06-16T20:44:12","modified_gmt":"2017-06-16T18:44:12","slug":"parsen-und-formatieren-von-datumszeitwerten-der-java-date-time-api","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/06\/parsen-und-formatieren-von-datumszeitwerten-der-java-date-time-api\/","title":{"rendered":"Parsen und Formatieren von Datumszeitwerten der Java Date Time API"},"content":{"rendered":"<p>Alle temporalen Typen \u00fcberschreiben standardm\u00e4\u00dfig die toString()-Methode und liefern eine standardisierte Ausgabe. Weiterhin lassen sich die temporalen Typen auch bei String.format(\u2026) und dem java.util.Formatter einsetzen.<\/p>\n<h4>format(\u2026)-Methode<\/h4>\n<p>Daneben bieten die Typen eine format(\u2026)-Methode, der ein Formatierungsobjekt \u00fcbergeben wird, sodass individuelle Ausgaben nach einem Muster m\u00f6glich sind.<\/p>\n<table style=\"height: 242px;\" width=\"589\">\n<tbody>\n<tr>\n<td width=\"446\">Klasse<\/td>\n<td width=\"446\">Formatierungsmethode<\/td>\n<\/tr>\n<tr>\n<td width=\"446\">LocalDateTime<\/td>\n<td width=\"446\">format(DateTimeFormatter formatter)<\/td>\n<\/tr>\n<tr>\n<td width=\"446\">LocalDate<\/td>\n<td width=\"446\">format(DateTimeFormatter formatter)<\/td>\n<\/tr>\n<tr>\n<td width=\"446\">LocalTime<\/td>\n<td width=\"446\">format(DateTimeFormatter formatter)<\/td>\n<\/tr>\n<tr>\n<td width=\"446\">ZonedDateTime<\/td>\n<td width=\"446\">format(DateTimeFormatter formatter)<\/td>\n<\/tr>\n<tr>\n<td width=\"446\">OffsetDateTime<\/td>\n<td width=\"446\">format(DateTimeFormatter formatter)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Temporale Klassen nutzen den gleiche Parametertyp DateTimeFormatter<\/p>\n<p>Die format(\u2026)-Methode nimmt einen DateTimeFormatter an, der die Ausgabe beschreibt. Wie kommen wir an einen DateTimeFormatter? Die Klasse hat keinen \u00f6ffentlichen Konstruktor, sondern Konstanten und statische Fabrikmethoden. \u00dcber drei Varianten kommen wir zum konkreten Objekt:<\/p>\n<ul>\n<li>Es gibt vordefinierte Konstanten f\u00fcr standardisierte ISO\/RFC-Ausgaben,<\/li>\n<li>Methoden f\u00fcr vordefinierte lang\/kurz-Formate (auch lokalisiert) und<\/li>\n<li>Methoden f\u00fcr komplett selbst zusammengestellte Ausgaben.<\/li>\n<\/ul>\n<p>Die API-Dokumentation z\u00e4hlt die Konstanten mit ihren Formaten aus, Beispiele sind ISO_LOCAL_DATE oder ISO_ZONED_DATE_TIME. Wichtig zu bedenken ist, dass der temporale Typ die Felder auch haben muss! Ein ISO_ZONED_DATE_TIME ist zum Beispiel bei einem LocalDate nicht m\u00f6glich.<\/p>\n<p>Praktischer sind die statischen ofLocalizedXXX(&#8230;)-Methoden, die eine Aufz\u00e4hlung FormatStyle (FULL, LONG, MEDIUM, SHORT) annehmen:<\/p>\n<ul>\n<li>DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle)<\/li>\n<li>DateTimeFormatter ofLocalizedDateTime(FormatStyle dateTimeStyle)<\/li>\n<li>DateTimeFormatter ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle)<\/li>\n<li>DateTimeFormatter ofLocalizedTime(FormatStyle timeStyle)<\/li>\n<\/ul>\n<p>Einen so aufgebauten DateTimeFormatter l\u00e4sst sich Zusatzinformation geben mit diversen withXXX(\u2026)-Methoden, etwa withLocale(Locale locale) oder withZone(ZoneId zone).<\/p>\n<p>Beispiel<\/p>\n<pre>LocalDateTime now = LocalDateTime.now();\n\nout.println( now.format( BASIC_ISO_DATE ) );\n\nout.println( now.format( ISO_LOCAL_DATE_TIME ) );\n\nout.println( now.format( ofLocalizedDate( SHORT ) ) );\n\nout.println( now.format( ofLocalizedDateTime( MEDIUM ) ) );\n\nout.println( now.format( ofLocalizedDateTime( FULL ).withLocale( FRANCE )\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .withZone( ZoneId.of( \"America\/Cayenne\" ) ) ) );<\/pre>\n<p>Die Ausgaben sehen so aus:<\/p>\n<p>20170616<\/p>\n<p>2017-06-16T20:39:11.2114379<\/p>\n<p>16.06.17<\/p>\n<p>16.06.2017, 20:39:11<\/p>\n<p>vendredi 16 juin 2017 \u00e0 20:39:11 heure de la Guyane fran\u00e7aise<\/p>\n<p>Eine v\u00f6llig flexible Ausgabe erm\u00f6glicht ein Muster.<\/p>\n<p>Beispiel<\/p>\n<p>LocalDate\u00a0now\u00a0=\u00a0LocalDate.now();<br \/>\nSystem.out.println(\u00a0now\u00a0);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a02014-03-21<br \/>\nDateTimeFormatter formatter = DateTimeFormatter.ofPattern( &#8222;d. MMMM yyyy&#8220; );<br \/>\nString\u00a0nowAsString\u00a0=\u00a0now.format( formatter );<br \/>\nSystem.out.println(\u00a0nowAsString\u00a0);\u00a0\u00a0\/\/\u00a021.\u00a0M\u00e4rz\u00a02014<br \/>\nLocalDate\u00a0nowAgain\u00a0=\u00a0LocalDate.parse( nowAsString, formatter );<br \/>\nSystem.out.println(\u00a0nowAgain\u00a0);\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\u00a02014-03-21<\/p>\n<p>Die API-Dokumentation zu DateTimeFormatter zeigt einige vordefinierte Formatierungsobjekte und listet alle Formatspezifizierer auf.<\/p>\n<h4>parse(\u2026)-Methode<\/h4>\n<p>Neben dem Formatieren bieten die Typen auch eine statische parse(\u2026)-Methode, die einmal mit einem String-Parameter das Format erwartet, was toString() liefert, und eine Version mit zwei Parametern, wobei dann ein Formatierungsobjekt erlaubt ist, um genau das Format anzugeben, nach dem geparst werden soll.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alle temporalen Typen \u00fcberschreiben standardm\u00e4\u00dfig die toString()-Methode und liefern eine standardisierte Ausgabe. Weiterhin lassen sich die temporalen Typen auch bei String.format(\u2026) und dem java.util.Formatter einsetzen. format(\u2026)-Methode Daneben bieten die Typen eine format(\u2026)-Methode, der ein Formatierungsobjekt \u00fcbergeben wird, sodass individuelle Ausgaben nach einem Muster m\u00f6glich sind. Klasse Formatierungsmethode LocalDateTime format(DateTimeFormatter formatter) LocalDate format(DateTimeFormatter formatter) LocalTime format(DateTimeFormatter [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1,11,66],"tags":[],"class_list":["post-3872","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-insel","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3872"}],"version-history":[{"count":5,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3872\/revisions"}],"predecessor-version":[{"id":3877,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3872\/revisions\/3877"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}