Estou simplesmente tentando converter uma string de data em um objeto DateTime em Java 8. Ao executar as seguintes linhas:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
Estou tendo o erro a seguir:
Exception in thread "main" java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
A sintaxe é idêntica ao que foi sugerido aqui , mas sou atendido com uma exceção. Eu estou usando JDK-8u25
.
java
datetime
java-8
datetime-format
retrografia
fonte
fonte
LocalDate
estava usando e nãoLocalDateTime
. O problema foi que eu criei meuDateTimeFormatter
uso.withResolverStyle(ResolverStyle.STRICT);
, então tive que usar o padrão de data emuuuuMMdd
vez deyyyyMMdd
(por exemplo, "ano" em vez de "ano da era")!Se você realmente precisar transformar uma data em um objeto LocalDateTime, poderá usar o LocalDate.atStartOfDay (). Isso fornecerá um objeto LocalDateTime na data especificada, com os campos de hora, minuto e segundo definidos como 0:
fonte
LocalDateTime.from
parece desnecessário, comoatStartOfDay()
já retornaLocalDateTime
.Pelo que vale a pena se alguém ler novamente este tópico (como eu), a resposta correta estaria em
DateTimeFormatter
definição, por exemplo:Deve-se definir os campos opcionais se eles aparecerem. E o restante do código deve ser exatamente o mesmo.
fonte
parseDefaulting
APÓS que você ligouappendPattern
. Caso contrário, vai darDateTimeParseException
.Esta é uma mensagem de erro realmente pouco clara e inútil. Depois de muitas tentativas e erros, descobri que
LocalDateTime
fornecerá o erro acima se você não tentar analisar um tempo. Ao usarLocalDate
, ele funciona sem erros.Isso está mal documentado e a exceção relacionada é muito inútil.
fonte
Expandindo a resposta da retrografia ..: Eu tive esse mesmo problema mesmo quando
LocalDate
estava usando e nãoLocalDateTime
. O problema foi que eu criei meuDateTimeFormatter
uso.withResolverStyle(ResolverStyle.STRICT);
, então tive que usar o padrão de data emuuuuMMdd
vez deyyyyMMdd
(por exemplo, "ano" em vez de "ano da era")!(Esta solução foi originalmente um comentário à resposta da retrografia, mas fui encorajado a publicá-la como uma resposta autônoma, porque aparentemente funciona muito bem para muitas pessoas.)
fonte
Para quem chegou aqui com esse erro, como eu fiz:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
Veio de uma linha a seguir:
Acabou que era porque eu estava usando um padrão de 12 horas em uma hora 0, em vez de um padrão de 24 horas.
Alterar a hora para o padrão de 24 horas usando H maiúsculo corrige:
fonte
Se a data String não incluir nenhum valor por horas, minutos e etc., você não poderá convertê-lo diretamente em a
LocalDateTime
. Você só pode convertê-lo em aLocalDate
, porque a string representa apenas os componentes de ano, mês e data que seria a coisa correta a fazer.De qualquer forma, você pode converter isso em
LocalDateTime
.fonte
yyyy-mm-dd
quando deveria ter sidoyyyy-MM-dd
.Tente este:
Você pode adicionar qualquer formato que desejar. Isso funciona para mim!
fonte
Isso funciona bem
resultado:
fonte