Разбор LocalTime с AM / PM - PullRequest
       7

Разбор LocalTime с AM / PM

0 голосов
/ 14 декабря 2018

У меня есть строка времени из другого источника в формате «чч: мма», например, 10:00 или 07:30.Мне нужно создать экземпляр LocalTime из этой строки.Я попытался разобрать его, вызвав метод: LocalTime.parse("10:00p", DateTimeFormatter.ofPattern("hh:mma")), но он выдает DateTimeParseException.В соответствии с DateTimeFormatter API часть времени должна быть в верхнем регистре и состоять из 2 букв (PM вместо p).Но есть ли какой-нибудь метод для анализа времени без изменения строки источника?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Но есть ли какой-либо способ для анализа времени без изменения строки источника?

Да, этот форматтер может сделать это для вас:

    Map<Long, String> ampmStrings = Map.of(0L, "a", 1L, "p");
    DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder()
            .appendPattern("hh:mm")
            .appendText(ChronoField.AMPM_OF_DAY, ampmStrings)
            .toFormatter();

С помощью DateTimeFormatterBuilder.appendText мы можем определить наши собственные тексты для форматирования и синтаксического анализа.Я использовал Java 9+ Map.of для инициализации карты двух пар ключ-значение.Если вы используете Java 6, 7 или 8, я верю, что вы инициализируете карту по-другому.Остальное все равно должно работать.

Давайте попробуем:

    String sourceLine = "10:00a";
    LocalTime time = LocalTime.parse(sourceLine, timeFormatter);
    System.out.println("Parsed time: " + time);

Вывод:

Время анализа: 10: 00

Еще лучшим вариантом было бы, если бы вы могли убедить свой источник предоставить строки в формате ISO 8601 (например, 10:00 и 19:30).

0 голосов
/ 14 декабря 2018

Замените p на PM, a на AM, затем проанализируйте его с помощью шаблона hh:mm a.

String time = "10:00p";
time = time.replace("p", "PM").replace("a", "AM"); // 10:00PM
LocalTime localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("hh:mm a", Locale.US));
System.out.println(localTime); // 22:00
...