tl; dr
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
Detalles
Tengo un java.util.Date con el formato aaaa-mm-dd
Como se mencionó en otros, la Date
clase no tiene formato. Tiene una cuenta de milisegundos desde principios de 1970 en UTC. Sin ataduras.
java.time
Las otras Respuestas usan antiguas clases de fecha y hora antiguas problemáticas, ahora suplantadas por las clases java.time.
Si tiene un java.util.Date
, conviértalo en un Instant
objeto. La Instant
clase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).
Instant instant = myUtilDate.toInstant();
Zona horaria
Las otras respuestas ignoran la cuestión crucial de la zona horaria. Determinar una fecha requiere una zona horaria. En un momento dado, la fecha varía en todo el mundo según la zona. Pocos minutos después de la medianoche en París, Francia es un nuevo día, mientras que todavía es “ayer” en Montreal Québec.
Defina la zona horaria por la que desea contexto para su Instant
.
ZoneId z = ZoneId.of( "America/Montreal" );
Aplicar ZoneId
para obtener un ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z );
LocalDate
Si solo le importa la fecha sin una hora del día, extraiga un LocalDate
.
LocalDate localDate = zdt.toLocalDate();
Para generar una cadena en formato estándar ISO 8601, AAAA-MM-DD, simplemente llame toString
. Las clases java.time utilizan los formatos estándar de forma predeterminada al generar / analizar cadenas.
String output = localDate.toString();
2017-01-23
Si desea un formato MM-DD-AAAA, defina un patrón de formato.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );
Tenga en cuenta que los códigos de patrón de formato distinguen entre mayúsculas y minúsculas. El código de la Pregunta se usó incorrectamente mm
(minuto de la hora) en lugar de MM
(mes del año).
Utilice el mismo DateTimeFormatter
objeto para analizar. Las clases java.time son seguras para subprocesos, por lo que puede mantener este objeto y reutilizarlo repetidamente incluso entre subprocesos.
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date
, Calendar
, y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
- Java SE 8 y SE 9 y posteriores
- Incorporado.
- Parte de la API estándar de Java con una implementación integrada.
- Java 9 agrega algunas funciones y correcciones menores.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad de java.time se actualiza a Java 6 y 7 en ThreeTen-Backport .
- Androide
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más .