Java8 разбирает дату или формат даты и времени для заданной строки

У меня есть файл, который может иметь измененное значение даты в формате даты или даты и времени. Я использовал для анализа значения как:

String t = "2012-01-05T21:21:52.834Z";
logger.info(ZonedDateTime.parse(t).toEpochSecond() * 1000);

Теперь строка также может быть

t = "2012-01-05";

который бросил ошибку

Исключение в потоке "main" java.time.format.DateTimeParseException: текст "2012-01-05" не может быть проанализирован с индексом 10 в java.time.format.DateTimeFormatter.parseResolved0(неизвестный источник)

Если я делаю эту строку с ( ссылка)

LocalDate date = LocalDate.parse(t, DateTimeFormatter.ISO_DATE);
logger.info(date.atStartOfDay(ZoneId.of("UTC")).toEpochSecond() * 1000);

Это будет работать. Однако, как я уже упоминал, строка может относиться к одному из этих типов, как я могу определить формат и затем получить миллис соответственно?

1 ответ

Решение

Возможное решение - использовать необязательный шаблон со значениями по умолчанию. Используя DateTimeFormatterBuilder, вы можете добавить нужный шаблон с временной частью в необязательном разделе, т.е. [...], В случае, когда поля отсутствуют, мы предоставляем значения по умолчанию, устанавливая их в 0. OFFSET_SECONDS поле до 0 представляет отсутствие смещения от UTC.

public static void main(String[] args) {
    String[] dates = { "2012-01-05T21:21:52.834Z", "2012-01-05" };

    DateTimeFormatter formatter = 
        new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd['T'HH:mm:ss.SSSz]")
                                      .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                      .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                                      .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                                      .parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
                                      .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
                                      .toFormatter();
    for (String date : dates) {
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, formatter);
        System.out.println(zonedDateTime.toEpochSecond() * 1000);
    }
}
Другие вопросы по тегам