2017-12-07 14 views
0

Ich habe ein Datum, das ich mit ZonedDateTime.now(ZoneOffset.of("+2:00")).minusDays(5) erstellt habe. Jetzt möchte ich es als yyyy-MM-dd formatieren.DateTimeFormatter.ISO_LOCAL_DATE vs DateTimeFormatter.ofPattern ("JJJJ-MM-TT") in Java 8+

In Java 8+, ist DateTimeFormatter.ISO_LOCAL_DATE das Äquivalent von DateTimeFormatter.ofPattern("yyyy-MM-dd")?

Die Ausgabe erscheint identisch und sieht aus wie in der Dokumentation, sollten sie gleich sein. Der "LOKALE" Teil von mir gab mir jedoch eine Pause. Beachten Sie, dass ich einen Offset habe und ich ZonedDateTime verwende. Ich wollte sicherstellen, dass es keine Probleme gab oder "sie sind die gleichen, außer unter diesen besonderen Umständen, da es sich um Offsets usw. handelt".

+3

können Sie nicht [die Quellen] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/time/format/DateTimeFormatter.java # DateTimeFormatter.0ISO_LOCAL_DATE) oder etwas testen? –

+1

Erstes Google-Ergebnis: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_LOCAL_DATE –

+0

Ich habe die Dokumente gelesen und beide getestet. Die Ausgabe erscheint identisch und sieht so aus, als ob sie aus der Dokumentation identisch sein sollten. Der "LOKALE" Teil von mir gab mir jedoch eine Pause. Beachten Sie, dass ich einen Offset habe und ich ZonedDateTime verwende. Ich glaube, ich war mehr auf der Suche nach irgendwelchen Schwierigkeiten oder "sie sind die gleichen, außer unter diesen besonderen Umständen, da Sie mit Offsets, etc. beschäftigt sind" –

Antwort

3

Für die Formatierung einer Datum-Zeit-Bezeichnung vor 5 Tagen sind die beiden Formatierer gleichwertig. Sie sind nicht für alle möglichen Daten äquivalent, weder zum Formatieren noch zum Parsen.

Lassen Sie uns versuchen, sie aus:

DateTimeFormatter yyyyMmDd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
    int[] yearsToTest = { -900_000_000, -10_000, -2, 0, 1, 2017, 2099, 9999, 10_000, 900_000_000 }; 
    for (int year : yearsToTest) { 
     LocalDate date = LocalDate.of(year, Month.DECEMBER, 2); 
     String dateFormattedIso = date.format(DateTimeFormatter.ISO_LOCAL_DATE); 
     String dateFormattedYyyyMmDd = date.format(yyyyMmDd); 
     String diff = dateFormattedIso.equals(dateFormattedYyyyMmDd) ? "Same" : "Different"; 
     System.out.format("%-18s%-18s%s%n", dateFormattedIso, dateFormattedYyyyMmDd, diff); 
    } 

Die oben genannten Schnipsel gibt:

-900000000-12-02 +900000001-12-02 Different 
-10000-12-02  +10001-12-02  Different 
-0002-12-02  0003-12-02  Different 
0000-12-02  0001-12-02  Different 
0001-12-02  0001-12-02  Same 
2017-12-02  2017-12-02  Same 
2099-12-02  2099-12-02  Same 
9999-12-02  9999-12-02  Same 
+10000-12-02  +10000-12-02  Same 
+900000000-12-02 +900000000-12-02 Same 

So für die Formatierung es scheint, dass sie seit Jahren in der gemeinsamen Zeit gleichwertig sind („AD“), aber nicht seit Jahren vor der gemeinsamen Ära. yyyy respektiert, dass es kein Jahr 0 gibt, so wird ein Jahr von 0 in der LocalDate als Jahr 1 gerendert. Es versteht sich, dass es BCE ist, diese Information wird nicht gedruckt. Der ISO-Formatierer nimmt das Jahr wörtlich, mit Vorzeichen und allem.

Sie können das Verhalten von ISO_LOCAL_DATE mit uuuu statt yyyy erhalten.

"Lokal" bedeutet hier nur ohne Zeitzone, was wiederum bedeutet, dass die Zeitzoneninformation von Ihrem ZonedDateTime nicht gedruckt wird, was Sie ohnehin nicht erwartet hätten.

+1

Ein weiterer Unterschied könnte das milde Verhalten sein. Soweit ich weiß, ist der Konstantenformatierer streng, während der Muster-basierte Formatierer in der Analyse klug ist. Dies ist wahrscheinlich relevant für Ausdrücke wie "2017-02-29" (im strikten Modus abgelehnt und im Smart-Modus angepasst). –

+0

Ja, @MenoHochschild, ich habe keine Unterschiede beim Parsen berücksichtigt, sicherlich gibt es welche. Danke für Ihren Beitrag in diese Richtung. –

1

ISO bedeutet hier ISO-8601. Dieses Format ist derzeit und wird wahrscheinlich dauerhaft JJJJ-MM-TT sein (keine Zeitzone, da es lokal ist). Aber fragen Sie sich selbst - wollen Sie ein ISO-Format, oder wollen Sie JJJJ-MM-TT? Die Tatsache, dass sie gleich sind, sollte für Sie unbedeutend sein - Sie treffen eine Entscheidung, die entweder auf einer Standardrepräsentation basiert oder auf einer bestimmten Repräsentation beruht. Oder vielleicht ist die Frage "Ich bin mir nicht sicher, ob ich ein Datum im ISO-Format haben möchte ... oder?" - dazu ist die Antwort, alle Dinge gleich, die du wahrscheinlich tust.