2016-06-30 49 views
1

我有以下兩個日期:如何解析日期與可選的字符格式

  • 8 2009年10月
  • 2010年5月13日

我使用傑克遜的日期從轉換休息api joda日期時間。

我認爲模式"dd MMM. yyyy"會工作,但「可能」沒有點,所以它在這一點上崩潰。

有沒有解決方案,還是我必須編寫我自己的日期時間分析器?

傑克遜的註解是:

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

因此,有隻允許一個日期模式。

+0

廣東話你只需要添加的點,如果本月是五月? –

回答

1

鑑於OP的新的意見和要求,解決的辦法是使用自定義解串器:

你會做這樣的事情:

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

請參見教程這裏:http://www.baeldung.com/jackson-deserialization

查看示例這裏:Custom JSON Deserialization with Jackson

OLD ANSWER:

您可以使用Java的SimpleDateFormat,要麼:

  1. 使用正則表達式來選擇合適的模式
  2. 簡單地嘗試他們和catch(和忽略)異常

例子:

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

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

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

問題是,我這個日期來自一個休息服務,我自動解析它 並在jackson註釋jsonformat只允許一個模式。在正常的源代碼中,上述問題很容易解決 – Fabi

+0

@Fabi查看我更新的答案 –

0

您可以只定義兩個格式化程序,並使用帶有點的格式化程序(如果它存在於字符串中)。

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

,也將通過固定用於解析字符串以不同的方式:

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