2013-10-02 34 views
4

我有以下(稍微縮寫)的代碼來解析String輸入到喬達時間DateTime對象。我需要妥善處理多種格式,其中包括四位兩位數年份的&。Joda時間&根據樞軸正確解析兩位數年份

setupValidDateFormats(); 
DateTime date = convertToDateTime(thisField.getText()); 
if (date != null) { 
    thisField.setText(date.toString("MM/dd/yyyy")); 
} else { 
    System.out.println("Invalid date"); 
} 

private void setupValidDateFormats() { 
    DateTimeParser[] formats = { 
      DateTimeFormat.forPattern("MM/dd/yyyy").getParser(), 
      DateTimeFormat.forPattern("MM/dd/yy").getParser(), 
      DateTimeFormat.forPattern("MM-dd-yyyy").getParser(), 
      DateTimeFormat.forPattern("MM-dd-yy").getParser(), 
      DateTimeFormat.forPattern("MMddyyyy").getParser(), 
      DateTimeFormat.forPattern("MMddyy").getParser() 
    }; 
    formatter = new DateTimeFormatterBuilder().append(null, formats).appendTwoDigitYear(1950, true).toFormatter() 
      .withLocale(Locale.US); 
} 

private DateTime convertToDateTime(String input) { 
    if (isNullOrEmpty(input)) { 
     return null; 
    } 

    DateTime date; 
    try { 
     // When you parse a date, it'll throw an exception for not only invalid formats, 
     // but for invalid values such as 09/31/2013 or 02/30/2013. Leap year is included as well. 
     date = formatter.parseDateTime(input); 
    } catch (Exception e) { 
     // User input a date in the incorrect format, or an invalid value. 
     // Example: 02/30/2013 is invalid. 
     date = null; 
    } 

    return date; 
} 

我遇到的問題是,當用戶進入120100,我希望它能夠在1900年12月1日和正確分析,最終輸出。但是,formatter.parseDateTime(input);convertToDateTime中將代替IllegalArgumentException,並且該方法返回null

也許值得一提的是,如果我從DateTimeFormatterBuilder鏈去除appendTwoDigitYear,輸入不會成功的解析,但120100變得12/01/0000,但是這不是我所需要的。

我誤解了Joda Time API嗎? 1950年的樞軸處不應該用appendTwoDigitYear作爲1900年的兩年數字嗎?

回答

6

當你使用像

DateTimeFormat.forPattern("MMddyyyy") 

的模式可以讀到這樣"120100"的日期。它所做的是讀取12MM,01dd00 as a literal value for yyyy, ie. 0 starting at year 0, so 0000

因爲該模式出現在parsers數組中的MMddyy之前,所以它將用於解析日期字符串。

你想要做什麼,以及重新排序或刪除該格式,是使用數據透視年。

public static void main(String[] args) throws Exception { 
    String str = "120100"; 

    DateTimeParser[] formats = { 
      DateTimeFormat.forPattern("MM/dd/yyyy").getParser(), 
      DateTimeFormat.forPattern("MM/dd/yy").getParser(), 
      DateTimeFormat.forPattern("MM-dd-yyyy").getParser(), 
      DateTimeFormat.forPattern("MM-dd-yy").getParser(), 
      DateTimeFormat.forPattern("MMddyy").getParser() 
    }; 

    DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, formats).toFormatter() 
      .withPivotYear(1950).withLocale(Locale.US); 

    DateTime dateTime = formatter.parseDateTime(str); 
    System.out.println(dateTime);  
} 

打印

1900-12-01T00:00:00.000-05:00 

我仍然試圖找出如何appendTwoDigitYear作品。