2009-05-19 11 views
72

Quiero convertir String en Date en diferentes formatos.Analizar cadena hasta la fecha con diferente formato en Java

Por ejemplo,

que estoy recibiendo de usuario,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format 

Quiero convertir este fromDate como un objeto Date de "yyyy-MM-dd" formato

¿Cómo puedo hacer esto?

+1

Un objeto de fecha no tiene formato, es solo un número que representa la fecha. La fecha se puede representar mediante una cadena con el formato "aaaa-MM-dd". –

Respuesta

152

Eche un vistazo a SimpleDateFormat. El código es algo como esto:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); 

try { 

    String reformattedStr = myFormat.format(fromUser.parse(inputString)); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 
+1

en lugar de obtener el formato de cadena, ¿puedo obtener la salida en formato 'Fecha'? – Rachel

+2

@Rachel: Claro, solo usa 'parse' y no vayas a' format'. 'parse' analiza una cadena a una fecha. –

+2

Pero 'parse' me da en' formato de fecha' como 'Vie 06 de enero a las 00:01:00 EST 2012' pero es necesario en formato de fecha' 2012-01-06' – Rachel

11

utilizar la clase SimpleDateFormat:

private Date parseDate(String date, String format) throws ParseException 
{ 
    SimpleDateFormat formatter = new SimpleDateFormat(format); 
    return formatter.parse(date); 
} 

Uso:

Date date = parseDate("19/05/2009", "dd/MM/yyyy"); 

Por eficiencia, que se quiere almacenar sus formateadores en un HashMap. El hashmap es un miembro estático de tu clase util.

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>(); 

public static Date parseDate(String date, String format) throws ParseException 
{ 
    SimpleDateFormat formatter = hashFormatters.get(format); 

    if (formatter == null) 
    { 
     formatter = new SimpleDateFormat(format); 
     hashFormatters.put(format, formatter); 
    } 

    return formatter.parse(date); 
} 
+8

CAVEAT !! La idea es buena, pero la implementación no lo es. ¡DateFormats no debe almacenarse estáticamente, ya que no son seguros para subprocesos! Si se utilizan desde más de un hilo (y esto siempre es riesgoso con estática). FindBugs contiene un detector para esto (que casualmente contribuí inicialmente, después de que me mordieran. Ver http://dschneller.blogspot.com/2007/04/calendar-dateformat-and-multi-threading.html :-)) –

+0

Tu entrada en el blog es una lectura interesante :-) ¿Qué ocurre si el mismo método parseDate está sincronizado? El problema es que probablemente ralentizaría el código ... – Agora

+1

Siempre que el método parseDate fuera el único método para acceder al mapa, la sincronización funcionaría. Sin embargo, esto, como usted dice, introduce un cuello de botella. –

3

Mientras SimpleDateFormat de hecho va a trabajar para sus necesidades, además, es posible que desee echa un vistazo a Joda Time, que al parecer es la base para la biblioteca remodelada Fecha en Java 7. Si bien no he Lo he usado mucho, no he escuchado nada más que cosas buenas al respecto y si su manipulación data extensamente en sus proyectos, probablemente valga la pena investigarlo.

+0

Joda es bueno! ¡Hurra! –

7

convertir una fecha a cadena java.sql.Date

String fromDate = "19/05/2009"; 
DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
java.util.Date dtt = df.parse(fromDate); 
java.sql.Date ds = new java.sql.Date(dtt.getTime()); 
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010 
1

Una manera sencilla para dar formato a una fecha y convertir en cadena

Date date= new Date(); 

    String dateStr=String.format("%td/%tm/%tY", date,date,date); 

    System.out.println("Date with format of dd/mm/dd: "+dateStr); 

de salida: Fecha con formato de dd/mm/dd: 21/10/2015

5

tl; dr

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern("dd/MM/uuuu") 
) 

Detalles

Las otras respuestas con java.util.Date, java.sql.Date y SimpleDateFormat son ahora obsoletos.

LocalDate

La forma moderna de hacer de fecha y hora es el trabajo con las clases java.time, específicamente LocalDate. La clase LocalDate representa un valor de solo fecha sin hora del día y sin zona horaria.

DateTimeFormatter

para analizar, o Generar, una cadena que representa un valor de fecha y hora, utilizar la clase DateTimeFormatter.

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu"); 
LocalDate ld = LocalDate.parse("19/05/2009" , f); 

No confundir un objeto de fecha y hora con una cadena que representa su valor. Un objeto de fecha y hora tiene no formato, mientras que un String sí lo hace. Un objeto de fecha y hora, como LocalDate, puede generar una Cadena para representar su valor interno, pero el objeto de fecha y hora y la Cadena son objetos distintos separados.

Puede especificar cualquier formato personalizado para generar una Cadena. O deje que java.time haga el trabajo de localizar automáticamente.

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) 
        .withLocale(Locale.CANADA_FRENCH) ; 
String output = ld.format(f); 

Volcar a la consola.

System.out.println("ld: " + ld + " | output: " + output); 

ld: 2009-05-19 | salida: mardi 19 mai 2009

See in action in IdeOne.com.


Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date, Calendar, & SimpleDateFormat. El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a java.time.

Para obtener más información, consulte el Oracle Tutorial. 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 más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Ver How to use….

El proyecto se extiende ThreeTen-Extra 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.

Cuestiones relacionadas