DateTimeFormatter с несколькими шаблонами не работает

Оба этих шаблона отлично работают при тестировании по отдельности, но они не работают вместе в одном выражении ofPattern { "[]" + "[]"}.

Пожалуйста, направьте, что мне здесь не хватает

import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class SampleProgram {
    
    private static final DateTimeFormatter dateTimeFormats = DateTimeFormatter.ofPattern(
            "[yyyy-MM-dd'T'HH:mm:ss.SSS]" + //: Year, month, day, 'T' separator, hour, minute, second, and milliseconds (e.g., 2023-05-21T12:34:56.789)
            "[yyyy-MM-dd'T'HH:mm:ss.SSSSSS]"  //: Year, month, day, 'T' separator, hour, minute, second, and microseconds (e.g., 2023-05-21T12:34:56.123456)
    );

    private static final String[] inputArray = new String[]{
        "2021-01-30T23:45:00.123",
        "2023-08-15T12:34:56.789123",
    };

    
    public static void main(String[] args) {
        
        for (var input : inputArray) {
            var ignore = LocalDateTime.parse(input, dateTimeFormats);
        }
        System.out.println("No exception occured!");
    }
}

Выход:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2023-08-15T12:34:56.789123' could not be parsed, unparsed text found at index 23
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at SampleProgram.main(SampleProgram.java:25)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам не нужны никакие DateTimeFormatter, потому что обе ваши строки даты и времени имеют формат ISO 8601, который является форматом по умолчанию, используемым типами java.time.

public static void main(String[] args) {
    for (var input : inputArray) {
        var ignore = LocalDateTime.parse(input);
    }
    System.out.println("No exception occured!");
}

Выход:

No exception occurred!

В случае, если вы хотите использовать свой DateTimeFormatter, измените его, чтобы сделать необязательным только долю секунды.

DateTimeFormatter dateTimeFormats = DateTimeFormatter.ofPattern(
                    "yyyy-MM-dd'T'HH:mm:ss[.[SSSSSS][SSS]]");

Онлайн демо

Узнайте больше о современном API Date-Time из Trail: Date Time.

Если вы измените порядок шаблона на

private static final DateTimeFormatter dateTimeFormats = DateTimeFormatter.ofPattern( "[yyyy-MM-dd'T'HH:mm:ss.SSSSSS]" + //: год, месяц, день, разделитель 'T', час, минута, секунда и микросекунды (например, 2023-05-21T12:34:56.123456) "[yyyy-MM-dd'T'HH:mm:ss.SSS]" //: год, месяц, день, разделитель "T", часы, минуты, секунды и миллисекунды (например, 2023-05-21T12:34:56.789) );

это должно помочь.

Таким образом, временная метка с микросекундами будет сначала обрабатываться синтаксическим анализатором для микросекунд. В нашем примере временная метка в микросекундах сначала обрабатывается миллисекундным синтаксическим анализатором, жалобы на микросекундную часть которого он не может обработать.

Другие вопросы по теме