我有以下(稍微縮寫)的代碼來解析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年的兩年數字嗎?