Joda Время и разборе две цифры года правильно основаны на шарнирах

У меня есть следующий (несколько сокращенный) код для синтаксического анализа 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, но это не то, что мне нужно.

Не понимаю ли я API-интерфейс Joda Time? Не следует appendTwoDigitYear с помощью поворотного дескриптора 1950 года двухзначной цифры 00 в 1900 году?

4
задан Neeko 02 окт. '13 в 21:11
источник поделиться
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.

6
ответ дан Sotirios Delimanolis 02 окт. '13 в 22:04
источник поделиться

Другие вопросы по меткам или Задайте вопрос