2015-09-12 5 views
9

Ein Java 8 DateTimeFormatter aus einem Muster erstellt wie d. MMM u nur Daten mit dem Monat geschrieben im Stil definiert durch TextStyle.SHORT (zB 13. Feb 2015), ein DateTimeFormatter von d. MMMM u erstellt analysieren kann nur Daten mit dem Monat analysiert im Stil geschrieben definiert von TextStyle.FULL (zB 13. February 2015). Im "alten" SimpleDateFormat war der Unterschied zwischen "MMM" und "MMMM" nur für die Formatierung wichtig, nicht für das Parsen. Daher war es leicht möglich, einen Parser zu erstellen, der sowohl die FULL- als auch die SHORT-Form von Monatsnamen.Ist es möglich, Daten mit TextStyle.SHORT und TextStyle.FULL für den Monat zu analysieren?

Ist es möglich, einen Java 8 DateTimeFormatter zu erstellen, der das auch kann? Oder muss ich immer zwei Parser erstellen, einen mit dem FULL und einen mit dem SHORT-Muster?

Antwort

6

Sie könnten die verschiedenen Monate Muster optional machen:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d. [MMMM][MMM] u HH:mm:ss z", Locale.US); 

    ZonedDateTime zdt1 = ZonedDateTime.parse("4. Jan 2015 00:00:00 UTC", formatter); 
    ZonedDateTime zdt2 = ZonedDateTime.parse("4. January 2015 00:00:00 UTC", formatter); 

    System.out.println(zdt1); 
    System.out.println(zdt2); 

Ausgang:

2015-01-04T00:00Z[UTC] 
2015-01-04T00:00Z[UTC] 

EDIT

Dieser Formatierer nur für parse() verwendet werden können, müssen Sie einen anderen fürzu verwenden.

+0

Ok, der einzige Nachteil, den ich sehe, ist, dass es nun "gebrochene" Strings wie "15. Januar 2015" parsen kann, aber das ist nicht wirklich ein großes Problem. Noch unentschlossen, wenn zwei Formatierungen/Parser nicht die elegantere Lösung sein könnten ... – David

+0

@David Ich würde sagen, wenn Sie nur zwei haben, ist es nicht wirklich wichtig, welche Lösung Sie wählen. Aber wenn es eine Möglichkeit gibt, dass Sie mehr Arten von Formaten analysieren müssen, sollten Sie wahrscheinlich einen Parser und einen Formatierer wählen (Sie können sogar die optionalen Teile verschachteln). – Cinnam