Joda Time & разбор двухзначного года правильно на основе пивота
У меня есть следующий (несколько сокращенный) код для разбора String
вход во время йода 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
, но это не то, что мне нужно.
Я неправильно понимаю API Joda Time? не должны appendTwoDigitYear
с поворотной ручкой 1950 года двузначная цифра 00 как 1900?
1 ответ
Когда вы используете шаблон как
DateTimeFormat.forPattern("MMddyyyy")
это может прочитать дату как "120100"
, Что он делает, это читает 12
за MM
, 01
за dd
, а также 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
работает.