Conversión de formato java.util.Date aaaa-mm-dd a mm-dd-aaaa

88

Tengo un java.util.Dateformato yyyy-mm-dd. Quiero que esté en el formatomm-dd-yyyy

A continuación se muestra la utilidad de muestra 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 obtengo no está en el formato mm-dd-yyyy.

Por favor, avíseme cómo formatear un java.util.Datede yyyy-mm-ddamm-dd-yyyy

user182944
fuente
2
¿A qué te refieres cuando dices ... tengo un java.util.Date en el formato aaaa-mm-dd?
Jayamohan
Significa que el formato actual en mi código para mostrarlo en la interfaz de usuario es yyyy-mm-dd.
user182944
1
por favor cambie mm pequeño a MM
Dilip D

Respuestas:

157

Date es un contenedor para 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ía utilizar 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 Datevalor subyacente . Este es el propósito de la DateFormatters

Actualizado con un ejemplo adicional

Por si acaso el primer ejemplo no tuviera sentido ...

Este ejemplo utiliza dos formateadores para formatear la misma fecha. Luego utilizo estos mismos formateadores para analizar los Stringvalores de nuevo a Dates. El análisis resultante no altera la forma en que Dateinforma su valor.

Date#toStringes solo un volcado de su contenido. No puede cambiar esto, pero puede formatear el Dateobjeto de la 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 SimpleDateFormatpara asegurarse de que no está utilizando los patrones incorrectos;)

Programador loco
fuente
La gran respuesta me ayudó. Estaba tratando de ejecutar una aplicación de muestra de línea de comandos para probar formatos (antes de usarla en una clase de Android); no pude encontrar la importación que necesitaba. Ninguna de las respuestas proporcionadas recuerda incluir eso: import java.text.SimpleDateFormat;
raddevus
34
SimpleDateFormat("MM-dd-yyyy");

en vez de

SimpleDateFormat("mm-dd-yyyy");

porque MM points Month,mm points minutes

SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
Nuevo Usuario
fuente
Aparte de este cambio, ¿hay algún otro cambio que deba realizar en el método util anterior? No puedo probarlo de inmediato, por eso pregunto esto. Además, ¿hay alguna forma mejor de formatear el java.util.Date?
user182944
15

'M' (Capital) representa el mes y 'm' (Simple) representa los minutos

Algún ejemplo 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)

Algún ejemplo 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
darshakat
fuente
3

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 Dateclase 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 Instantobjeto. La Instantclase 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 ZoneIdpara 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 DateTimeFormatterobjeto 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?

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 .

Albahaca Bourque
fuente
1

Es un uso sencillo 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);
Ujitha
fuente
(A) Este código ignora la cuestión crucial de las zonas horarias. (B) Este código utiliza clases de fecha y hora antiguas problemáticas que han sido heredadas durante años. Evítales. Reemplazado por las clases java.time.
Basil Bourque
1

Puede obtener día, mes y año y puede concatenarlos o puede usar el formato MM-dd-aaaa como se indica a continuación.

Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);



Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1   = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1  = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);



LocalDateTime ldt1 = LocalDateTime.now();  
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy3 = ldt1.format(format1);  
System.out.println("Formatted Date 3: " + mmddyyyy3);  



LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);



LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy5 = ldt3.format(format2);   
System.out.println("Formatted Date 5: " + mmddyyyy5); 



Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3  = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);



Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4  = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);



Date date4 = new Date();
int day5   = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5  = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);



Date date5 = new Date();
int day6   = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6  = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);`enter code here`
System.out.println("Formatted Date 9: " + mmddyyyy9);
fnizami
fuente
1

Cambie el mes pequeño en "mm" por "MM" en mayúscula y funcionará. Para referencia, a continuación se muestra 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);
Dilip D
fuente