tl; dr
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
Detalhes
Eu tenho um java.util.Date no formato aaaa-mm-dd
Como outro mencionado, a Date
aula não possui formato. Tem uma contagem de milissegundos desde o início de 1970 no UTC. Sem condições.
java.time
As outras Respostas usam classes antigas e problemáticas de data e hora, agora suplantadas pelas classes java.time.
Se você tiver um java.util.Date
, converta em um Instant
objeto. A Instant
classe representa um momento na linha do tempo em UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).
Instant instant = myUtilDate.toInstant();
Fuso horário
As outras respostas ignoram a questão crucial do fuso horário. Determinar uma data requer um fuso horário. Para qualquer momento, a data varia ao redor do globo por zona. Poucos minutos depois da meia-noite em Paris, a França é um novo dia, enquanto ainda “ontem” em Montreal Québec.
Defina o fuso horário pelo qual você deseja contexto para o seu Instant
.
ZoneId z = ZoneId.of( "America/Montreal" );
Aplique o ZoneId
para obter um ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z );
LocalDate
Se você só se preocupa com a data sem uma hora do dia, extraia a LocalDate
.
LocalDate localDate = zdt.toLocalDate();
Para gerar uma string no formato ISO 8601 padrão, AAAA-MM-DD, basta chamar toString
. As classes java.time usam os formatos padrão por padrão ao gerar / analisar strings.
String output = localDate.toString();
23/01/2017
Se você deseja um formato MM-DD-AAAA, defina um padrão de formatação.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );
Observe que os códigos de padrão de formatação diferenciam maiúsculas de minúsculas. O código na pergunta usado incorretamente mm
(minuto da hora) em vez de MM
(mês do ano).
Use o mesmo DateTimeFormatter
objeto para análise. As classes java.time são thread-safe, portanto, você pode manter esse objeto por perto e reutilizá-lo repetidamente, mesmo entre threads.
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Onde obter as classes java.time?
- Java SE 8 e SE 9 e posterior
- Construídas em.
- Parte da API Java padrão com uma implementação agrupada.
- Java 9 adiciona alguns recursos e correções menores.
- Java SE 6 e SE 7
- Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
- Android
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .