Java8 DateTimeFormatter утра/вечера

Я пытаюсь проанализировать некоторые даты, но DateTimeParser, похоже, не согласен со мной в том, что действительно

import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.Locale

ZonedDateTime.parse("Wed Jul 16, 2016 4:38pm EDT", DateTimeFormatter.ofPattern("EEE MMM dd, yyyy hh:mma z", Locale.US))

Когда я пробую это, он говорит

java.time.format.DateTimeParseException: Text 'Wed Jul 16, 2016 4:38pm EDT' could not be parsed at index 17

Значит, что-то не так с часами? Когда я бросаю один из «h», он становится дальше (хотя он должен просто 0-дополнять мои часы), но тогда ему не нравятся pm-stuff

ZonedDateTime.parse("Wed Jul 16, 2016 4:38pm EDT", DateTimeFormatter.ofPattern("EEE MMM dd, yyyy h:mma z", Locale.US))
java.time.format.DateTimeParseException: Text 'Wed Jul 16, 2016 4:38pm EDT' could not be parsed at index 21

Я не знаю, в чем его точная проблема. Когда я пробую «чч: ммаа» в качестве шаблона, он говорит, что ему не нравятся два а, и теперь я застрял, так как сообщения об ошибках бесполезны.


person Community    schedule 07.07.2016    source источник


Ответы (3)


a ожидает либо PM, либо AM в верхнем регистре. Чтобы получить модуль форматирования без учета регистра, вам нужно создать его вручную:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("EEE MMM dd, yyyy h:mma z")
        .toFormatter(Locale.US);

Обратите внимание, что вы получите новую ошибку, потому что 16 июля не среда.

person assylias    schedule 07.07.2016
comment
ничего себе .. Любая идея, почему по умолчанию не поддерживает нижний регистр? Я преобразовывал старый код java.util.Date в java.time, и у SimpleDateFormat не было проблем с ним. - person Matthijs Wessels; 15.09.2017
comment
Случай зависит от вашей локали. Смотрите мой ответ ниже. - person Matthew; 07.01.2021

Обратите внимание, что регистр AM и PM зависит от вашей локали!

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

См.: Локализуйте период (AM/ PM) с отметкой времени на другой язык для получения более подробной информации.

person Matthew    schedule 07.01.2021
comment
Действительно очень хороший момент - person assylias; 08.01.2021

Оказывается, это решение также разрешает попытки разобрать месяцы со смешанным регистром (например, «июль») с использованием «МММ».

person Community    schedule 17.05.2018