我有以下(略有缩写)代码将String
输入解析为Joda Time DateTime
对象。我需要正确处理多种格式,包括四种格式两位数年。
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
时,我希望它能够正确解析并最终在12/01/1900输出。但是,formatter.parseDateTime(input);
中的convertToDateTime
会引发IllegalArgumentException
,而该方法会返回null
。
可能值得注意的是,如果我从appendTwoDigitYear
链中删除DateTimeFormatterBuilder
,则输入会成功解析,但120100
会变为12/01/0000
,但这不是我需要的
我是否误解了Joda Time API?不应该使用1950年代的appendTwoDigitYear
将00年两年的数字作为1900处理?
答案 0 :(得分:6)
使用
之类的模式时DateTimeFormat.forPattern("MMddyyyy")
它可以读取"120100"
之类的日期。它的作用是阅读12
的{{1}},MM
的{{1}}和00
as a literal value for yyyy
, ie. 0
starting at year 0
, so 0000
。
由于该模式显示在01
数组中的dd
之前,因此它将用于解析您的日期字符串。
您要做的事情,以及重新排序或删除该格式,都是使用支点年份。
MMddyy
打印
parsers
我仍在试图弄清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);
}
的工作原理。