Есть ли способ в Java преобразовать строки в даты, которые являются MMddyyyy или Mddyyyy? - PullRequest
2 голосов
/ 14 февраля 2020

Я пытался преобразовать строки в даты. Некоторые из них появляются так: 1011970 (как на 1 января 1970 года), а некоторые появляются так: 10011970 (как на 1 октября 1970 года). Тот факт, что месяц в начале, создал для меня большую проблему.

Я уже пришел к решению, что я могу просто проверить, сколько цифр имеет число и использовать отдельные средства форматирования, но я бы предпочел использовать что-то более элегантное. Я пытался использовать DateTimeFormatterBuilder для создания форматера «один размер подходит всем». Вот пример чего-то, что я попробовал, и полученного результата.

        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NORMAL)
            .appendPattern("ddyyyy")
            .toFormatter();

        System.out.println(LocalDate.parse("10011970", formatter));
        System.out.println(LocalDate.parse("1011970", formatter));
Date: 1970-10-01                                                                                                       
Exception in thread "main" java.time.format.DateTimeParseException: Text '1011970' could not be parsed at index 4      
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)                              
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)                                       
        at java.time.LocalDate.parse(LocalDate.java:400)                                                               
        at Main.main(Main.java:36) 

Так что, как вы можете видеть, вышеупомянутое решение работает для первой отформатированной даты, но не для второй. Пожалуйста, дайте мне знать, если у вас есть идеи.

Заранее спасибо! Джеймс

1 Ответ

2 голосов
/ 14 февраля 2020

Вы были на правильном пути. Это работает:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendValue(ChronoField.MONTH_OF_YEAR)
            .appendValue(ChronoField.DAY_OF_MONTH, 2)
            .appendValue(ChronoField.YEAR, 4)
            .toFormatter();

    System.out.println(LocalDate.parse("10011970", formatter));
    System.out.println(LocalDate.parse("1011970", formatter));

И вывод:

1970-10-01
1970-01-01

Я не знаю, почему это не работает при указании дня месяца и года через шаблон формата, но это не так, я уже видел это раньше.

Кроме того, практическое правило для разбор соседних значений (разбор чисел c дата-время поля без разделителя между ними), что вам нужно указать точную ширину каждого поля, кроме первого. Затем средство форматирования вычисляет ширину от конца строки, чтобы узнать, сколько цифр нужно использовать для первого значения (здесь месяц). Таким образом, ваш вариант использования прекрасно подходит.

...