¿Cómo puedo cambiar el formato de fecha en Java?

Necesito cambiar el formato de fecha usando Java de

dd/MM/yyyy to yyyy/MM/dd 

Cómo convertir de un formato de fecha a otro usando SimpleDateFormat :

 final String OLD_FORMAT = "dd/MM/yyyy"; final String NEW_FORMAT = "yyyy/MM/dd"; // August 12, 2010 String oldDateString = "12/08/2010"; String newDateString; SimpleDateFormat sdf = new SimpleDateFormat(OLD_FORMAT); Date d = sdf.parse(oldDateString); sdf.applyPattern(NEW_FORMAT); newDateString = sdf.format(d); 
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); sdf.format(new Date()); 

Esto debería funcionar

Use SimpleDateFormat

  String DATE_FORMAT = "yyyy/MM/dd"; SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); System.out.println("Formated Date " + sdf.format(date)); 

Ejemplo completo:

 import java.text.SimpleDateFormat; import java.util.Date; public class JavaSimpleDateFormatExample { public static void main(String args[]) { // Create Date object. Date date = new Date(); // Specify the desired date format String DATE_FORMAT = "yyyy/MM/dd"; // Create object of SimpleDateFormat and pass the desired date format. SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); /* * Use format method of SimpleDateFormat class to format the date. */ System.out.println("Today is " + sdf.format(date)); } } 

tl; dr

 LocalDate.parse( "23/01/2017" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" , Locale.UK ) ).format( DateTimeFormatter.ofPattern( "uuuu/MM/dd" , Locale.UK ) ) 

2017/01/23

Evite las clases heredadas de fecha y hora

La respuesta de Christopher Parker es correcta pero desactualizada. Las antiguas clases problemáticas de fecha y hora como java.util.Date , java.util.Calendar y java.text.SimpleTextFormat ahora son heredadas , suplantadas por las clases java.time .

Usando java.time

Analice la cadena de entrada como un objeto de fecha y hora, luego genere un nuevo objeto de cadena en el formato deseado.

La clase LocalDate representa un valor de solo fecha sin hora del día y sin zona horaria.

 DateTimeFormatter fIn = DateTimeFormatter.ofPattern( "dd/MM/uuuu" , Locale.UK ); // As a habit, specify the desired/expected locale, though in this case the locale is irrelevant. LocalDate ld = LocalDate.parse( "23/01/2017" , fIn ); 

Definir otro formateador para la salida.

 DateTimeFormatter fOut = DateTimeFormatter.ofPattern( "uuuu/MM/dd" , Locale.UK ); String output = ld.format( fOut ); 

2017/01/23

Por cierto, considere usar formatos estándar ISO 8601 para cadenas que representan valores de fecha y hora.


Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas 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 de java.time?

  • Java SE 8 , Java SE 9 y posterior
    • 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 Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • 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 más .


Joda-Time

ACTUALIZACIÓN: El proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo recomienda la migración a las clases java.time . Esta sección aquí queda por el bien de la historia.

Para divertirse, aquí está su código adaptado para usar la biblioteca Joda-Time .

 // © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. // import org.joda.time.*; // import org.joda.time.format.*; final String OLD_FORMAT = "dd/MM/yyyy"; final String NEW_FORMAT = "yyyy/MM/dd"; // August 12, 2010 String oldDateString = "12/08/2010"; String newDateString; DateTimeFormatter formatterOld = DateTimeFormat.forPattern(OLD_FORMAT); DateTimeFormatter formatterNew = DateTimeFormat.forPattern(NEW_FORMAT); LocalDate localDate = formatterOld.parseLocalDate( oldDateString ); newDateString = formatterNew.print( localDate ); 

Volcado a la consola …

 System.out.println( "localDate: " + localDate ); System.out.println( "newDateString: " + newDateString ); 

Cuando se ejecuta …

 localDate: 2010-08-12 newDateString: 2010/08/12 
 SimpleDateFormat newDateFormat = new SimpleDateFormat("dd/MM/yyyy"); Date myDate = newDateFormat.parse("28/12/2013"); newDateFormat.applyPattern("yyyy/MM/dd") String myDateString = newDateFormat.format(myDate); 

Ahora MyDate = 2013/12/28

Esta es solo la respuesta de Christopher Parker adaptada para usar las nuevas 1 clases de Java 8:

 final DateTimeFormatter OLD_FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy"); final DateTimeFormatter NEW_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String oldString = "26/07/2017"; LocalDate date = LocalDate.parse(oldString, OLD_FORMATTER); String newString = date.format(NEW_FORMATTER); 

1 bien, ya no tan nuevo, Java 9 debería lanzarse pronto.

O puede ir a la ruta de expresión regular:

 String date = "10/07/2010"; String newDate = date.replaceAll("(\\d+)/(\\d+)/(\\d+)", "$3/$2/$1"); System.out.println(newDate); 

Funciona en ambos sentidos también. Por supuesto, esto no validará su fecha y también funcionará para cadenas como “21432/32423/52352”. Puede usar "(\\d{2})/(\\d{2})/(\\d{4}" para ser más exactos en el número de dígitos en cada grupo, pero solo funcionará desde dd / MM / aaaa a aaaa / MM / dd y no al revés (y aún acepta números no válidos allí como 45). Y si le da algo no válido como “blabla”, devolverá lo mismo.

muchas formas de cambiar el formato de fecha

 private final String dateTimeFormatPattern = "yyyy/MM/dd"; private final Date now = new Date(); final DateFormat format = new SimpleDateFormat(dateTimeFormatPattern); final String nowString = format.format(now); final Instant instant = now.toInstant(); final DateTimeFormatter formatter = DateTimeFormatter.ofPattern( dateTimeFormatPattern).withZone(ZoneId.systemDefault()); final String formattedInstance = formatter.format(instant); /* Java 8 needed*/ LocalDate date = LocalDate.now(); String text = date.format(formatter); LocalDate parsedDate = LocalDate.parse(text, formatter); 

Para cambiar el formato de la fecha que tiene Requiere ambos formato, busque a continuación.

  String stringdate1 = "28/04/2010"; try { SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy"); Date date1 = format1.parse() SimpleDateFormat format2 = new SimpleDateFormat("yyyy/MM/dd"); String stringdate2 = format2.format(date1); } catch (ParseException e) { e.printStackTrace(); } 

aquí stringdate2 tiene formato de fecha de yyyy/MM/dd . y contiene 2010/04/28 .

 SimpleDateFormat format1 = new SimpleDateFormat("yyyy/MM/dd"); System.out.println(format1.format(date));