simple - conversión de formato java.util.Date aaaa-mm-dd a mm-dd-aaaa
simple date format java example (6)
Tengo un java.util.Date
en el formato yyyy-mm-dd
. Quiero que esté en el formato mm-dd-yyyy
A continuación se muestra el ejemplo de utilidad que probé para esta conversión:
// Setting the pattern
SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy");
// myDate is the java.util.Date in yyyy-mm-dd format
// Converting it into String using formatter
String strDate = sm.format(myDate);
//Converting the String back to java.util.Date
Date dt = sm.parse(strDate);
Aún así, la salida que recibo no está en el formato mm-dd-yyyy
.
Por favor, hágamelo saber cómo formatear un java.util.Date
de yyyy-mm-dd
a mm-dd-yyyy
tl; dr
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
Detalles
Tengo un java.util.Date en el formato aaaa-mm-dd
Como otros mencionados, la clase Date
no tiene formato. Tiene un recuento de milisegundos desde el comienzo de 1970 en UTC. Sin ataduras.
java.time
Las otras respuestas usan clases heredadas antiguas de fecha y hora, ahora suplantadas por las clases java.time.
Si tiene un java.util.Date
, conviértalo en un objeto Instant
. La clase Instant
representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds (hasta nueve (9) dígitos de una fracción decimal).
Instant instant = myUtilDate.toInstant();
Zona horaria
Las otras respuestas ignoran el problema crucial de la zona horaria. La determinación de una fecha requiere un huso horario. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Unos minutos después de la medianoche en París, Francia es un nuevo día, aún "ayer" en Montreal Québec.
Defina el huso horario según el contexto de su Instant
.
ZoneId z = ZoneId.of( "America/Montreal" );
Aplique 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 a 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-YYYY, defina un patrón de formateo.
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 en la Pregunta utiliza incorrectamente mm
(minuto de hora) en lugar de MM
(mes del año).
Use el mismo objeto DateTimeFormatter
para analizar. Las clases java.time son seguras para subprocesos, por lo que puede mantener este objeto alrededor y reutilizarlo repetidamente incluso a través de subprocesos.
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
Acerca de java.time
El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases legacy 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 para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases de java.time?
- Java SE 8 y SE 9 y posteriores
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características y correcciones menores.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Android
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
- Consulte Cómo utilizar ThreeTenABP ....
El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
y more .
''M'' (Capital) representa el mes y ''m'' (Simple) representa minutos
Algunos ejemplos por meses
''M'' -> 7 (without prefix 0 if it is single digit)
''M'' -> 12
''MM'' -> 07 (with prefix 0 if it is single digit)
''MM'' -> 12
''MMM'' -> Jul (display with 3 character)
''MMMM'' -> December (display with full name)
Algunos ejemplos por minutos
''m'' -> 3 (without prefix 0 if it is single digit)
''m'' -> 19
''mm'' -> 03 (with prefix 0 if it is single digit)
''mm'' -> 19
Cambie el pequeño mes "mm" al "MM" mayúsculo. Funcionará. La referencia a continuación es el código de muestra.
**Date myDate = new Date();
SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
Date dt = sm.parse(strDate);
System.out.println(strDate);**
Es simple uso debajo de los códigos.
final Date todayDate = new Date();
System.out.println(todayDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate));
System.out.println(todayDate);
Date
es un contenedor por el número de milisegundos desde la época de Unix (00:00:00 UTC del 1 de enero de 1970).
No tiene concepto de formato.
Java 8+
LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);
Salidas ...
05-11-2018
2018-05-11
2018-05-11T17:24:42.980
Java 7-
Deberías hacer uso de ThreeTen Backport
Respuesta original
Por ejemplo...
Date myDate = new Date();
System.out.println(myDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(myDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(myDate));
System.out.println(myDate);
Salidas ...
Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013
Ninguno de los formatos ha cambiado el valor Date
subyacente. Este es el propósito de la DateFormatter
s
Actualizado con un ejemplo adicional
Por si el primer ejemplo no tuviera sentido ...
Este ejemplo usa dos formateadores para formatear la misma fecha. Luego uso estos mismos formateadores para analizar los valores de String
nuevo a la Date
. El análisis resultante no altera la forma en que Date
informa su valor.
Date#toString
es solo un volcado de su contenido. No puede cambiar esto, pero puede formatear el objeto Date
forma que desee
try {
Date myDate = new Date();
System.out.println(myDate);
SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy");
SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd");
// Format the date to Strings
String mdy = mdyFormat.format(myDate);
String dmy = dmyFormat.format(myDate);
// Results...
System.out.println(mdy);
System.out.println(dmy);
// Parse the Strings back to dates
// Note, the formats don''t "stick" with the Date value
System.out.println(mdyFormat.parse(mdy));
System.out.println(dmyFormat.parse(dmy));
} catch (ParseException exp) {
exp.printStackTrace();
}
Qué salidas ...
Wed Aug 28 16:24:54 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 00:00:00 EST 2013
Wed Aug 28 00:00:00 EST 2013
Además, tenga cuidado con los patrones de formato. Eche un vistazo más de cerca a SimpleDateFormat
para asegurarse de que no está utilizando los patrones incorrectos;)
SimpleDateFormat("MM-dd-yyyy");
en lugar de
SimpleDateFormat("mm-dd-yyyy");
porque MM points Month
, mm points minutes
SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);