Então, estou tentando analisar uma string de um arquivo que se parece com 02/01/2025 18:00
O código que tenho em mãos é:
private static final String DATE_FORMAT = "MM/dd/yyyy HH:mm";
....
Date date = Date.from(LocalDateTime.parse(record.get("start_date").toString(), DateTimeFormatter.ofPattern(DATE_FORMAT)).atZone(ZoneId.systemDefault()).toInstant()));
Entretanto, quando vou testar esta seção de código, ele lança uma DateTimeParseException:
java.time.format.DateTimeParseException: Text '2/1/2025 18:00' could not be parsed at index 0
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
....
À primeira vista, acredito que tenho o formato correto, mas parece que não é o caso. Alguém sabe o que posso ter errado?
Primeiro, muito código amontoado em uma linha.
Em segundo lugar, seu padrão de formatação não corresponde à sua entrada.
Em terceiro lugar, não misture as classes legadas terrivelmente falhas com sua substituição moderna, java.time .
Padrão de formatação
O uso de letras duplas
HH
significadd
que você espera que suas entradas preencham qualquer número de um dígito com um zero à esquerda. Seu exemplo de entrada não atende a essa expectativa. Portanto, use um dígito.LocalDateTime
Analise sua entrada como um
LocalDateTime
objeto porque ela não tem o contexto de um deslocamento ou fuso horário.Use linhas de código curtas e simples. Fácil de ler e editar por humanos, fácil de otimizar pelo compilador e pelo tempo de execução.
ZonedDateTime
Aparentemente, você quer assumir que data e hora representam um momento, como visto no fuso horário padrão atual da JVM. Parece arriscado para mim, mas vamos lá.
Converter para classes legadas
Por fim, você parece querer converter nossas classes java.time, modernas e líderes do setor , para a miserável e miserável classe de data e hora legada. Tente evitar isso. Mas se você precisar converter para interagir com código antigo ainda não atualizado para java.time , vamos lá.
Primeiro, ajuste para um deslocamento de zero horas-minutos-segundos do UTC extraindo um
Instant
.Converter para equivalente de classe legada,
java.util.Date
.