我有以下(略略)的代码将String
输入解析为Joda TimeDateTime
对象。我需要正确处理多种格式,包括四位数和两位数年份。
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);
inconvertToDateTime
抛出一个IllegalArgumentException
代替,该方法返回null
。
可能值得注意的是,如果我appendTwoDigitYear
从DateTimeFormatterBuilder
链中删除,则输入会成功解析,但120100
变为12/01/0000
,但这不是我所需要的。
我是否误解了Joda Time API?不应该appendTwoDigitYear
使用1950年的支点来处理00的两位数,即1900年吗?
当您使用像
DateTimeFormat.forPattern("MMddyyyy")
它可以读取类似的日期"120100"
。它的作用是读取12
for MM
,01
fordd
和00
作为的字面值yyyy
,即。所以0
从一年开始0
0000
。
由于该模式之前,会出现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);
}
版画
1900-12-01T00:00:00.000-05:00
我仍在尝试弄清楚其appendTwoDigitYear
工作原理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句