2016-06-30 9 views
1

Ich habe die beiden folgenden Termine:Wie Datum mit optionalen Zeichen in Format analysieren

  • 8. Oktober 2009
  • 13. Mai 2010

Ich Jackson bin mit dem Datum konvertieren von eine Ruhe api zu Joda Datetime.

Ich dachte, das Muster "dd MMM. yyyy" würde funktionieren, aber die "Mai" hat keinen Punkt, so dass es an diesem Punkt abstürzt.

Gibt es eine Lösung oder muss ich meinen eigenen datetime Parser schreiben?

Die Anmerkung in Jackson ist:

@JsonFormat(pattern = "dd MMM. yyyy", timezone = "UTC", locale = "US",) 
@JsonProperty(value = "date") 
private DateTime date; 

So gibt erlaubt nur ein Datum Muster.

+0

Cant Sie nur den Punkt hinzufügen, wenn der Monat Mai ist? –

Antwort

1

OPs neuen Kommentar und Anforderungen Gegeben ist die Lösung eine benutzerdefinierte Deserializer zu verwenden:

Sie so etwas tun würde:

@JsonDeserialize(using = MyDateDeserializer.class) 
class MyClassThatHasDateField {...} 

Siehe Tutorial hier: http://www.baeldung.com/jackson-deserialization

ein Beispiel anzeigen hier: Custom JSON Deserialization with Jackson

ALTE ANTWORT:

können Sie Java verwenden SimpleDateFormat und entweder:

  1. einen regulären Ausdruck Verwenden Sie das richtige Muster
  2. einfach versuchen, sie und fangen (und ignorieren) die Ausnahme

Beispiel zu wählen:

String[] formats = { "dd MMM. yyyy", "dd MM yyyy" }; 

for (String format : formats) 
{ 
    try 
    { 
     return new SimpleDateFormat(format).parse(theDateString); 
    } 
    catch (ParseException e) {} 
} 

ODER

String[] formats = { "dd MMM. yyyy", "dd MM yyyy" }; 
String[] patterns = { "\\d+ [a-zA-Z]+\. \d{4}", "\\d+ [a-zA-Z]+ \d{4}" }; 

for (int i = 0; i < patterns.length; i++) 
{ 
    // Create a Pattern object 
    Pattern r = Pattern.compile(patterns[ i ]); 

    // Now create matcher object. 
    Matcher m = r.matcher(theDateString); 

    if (m.find()) { 
    return new SimpleDateFormat(formats[ i ]).parse(theDateString); 
    } 
} 
+0

Das Problem ist, dass ich dieses Datum von einem Rest-Service kommt und ich parse es automatisch und in der Jackson Annotation ermöglicht nur ein Muster jsonformat. im normalen Quellcode wäre das obige Problem einfach zu lösen – Fabi

+0

@Fabi Siehe meine aktualisierte Antwort –

0

Sie könnten einfach zwei Formatierer definieren und die mit einem Punkt verwenden, wenn sie in der Zeichenfolge vorhanden ist.

String dateString = "8 Oct. 2009"; 

DateTimeFormatter formatWithDot = DateTimeFormat.forPattern("dd MMM. yyyy"); 
DateTimeFormatter formatWithoutDot = DateTimeFormat.forPattern("dd MMM yyyy"); 

DateTime date = dateString.indexOf('.') > -1 
    ? formatWithDot.parseDateTime(dateString) 
    : formatWithoutDot.parseDateTime(dateString); 
0

würde es auch einen anderen Weg, indem die Zeichenfolge für das Parsen Fixierung:

String date = "13 May. 2009"; 
DateTime result = DateTime.parse(date.replace(".",""), 
DateTimeFormat.forPattern("dd MMM yyyy"));