Analizar cadena hasta la fecha con formato diferente en Java

91

Quiero convertir Stringa Datediferentes formatos.

Por ejemplo,

Estoy recibiendo del usuario,

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

Quiero convertir esto fromDatecomo un objeto de "yyyy-MM-dd"formato de fecha

¿Cómo puedo hacer esto?

Gnaniyar Zubair
fuente
2
Un objeto 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".
user85421

Respuestas:

181

Échale un vistazo 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();
}
Michael Myers
fuente
1
en lugar de obtener un formato de cadena, ¿puedo obtener la salida en Dateformato?
Rachel
4
@Rachel: Claro, solo use parsey no continúe format. parseanaliza una cadena a una fecha.
Michael Myers
3
Pero parseme da date formatcomo Fri Jan 06 00:01:00 EST 2012pero necesita en 2012-01-06formato de fecha
Rachel
1
@Rachel es porque cuando llamas System.out.println(anyDateObject)al método toString () predeterminado, se llama que se dice que imprime en ese formato, por ejemplo Fri Jan 06 00:01:00 EST 2012. Debe anularlo para que se adapte a sus necesidades.
KNU
3
Para su información, las problemáticas clases antiguas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el tutorial de Oracle .
Basil Bourque
13

tl; dr

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

Detalles

Las otras respuestas con java.util.Date, java.sql.Datey SimpleDateFormatse ha quedado desfasado.

LocalDate

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

DateTimeFormatter

Para analizar o generar una cadena que represente un valor de fecha y hora, use la DateTimeFormatterclase.

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

No combine un objeto de fecha y hora con una cadena que represente su valor. Un objeto de fecha y hora no tiene formato , mientras que un String sí. 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 se encargue de la localización automática.

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

Véalo en acción en IdeOne.com .


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 .

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan java.sql.*clases.

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 y posterior
    • 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 Java SE 7
    • Gran parte de la funcionalidad de java.time está adaptada a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para anteriormente Android (<26), el ThreeTenABP proyecto adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP… .

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
12

Usa la SimpleDateFormatclase:

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");

Para mayor eficiencia, querrá almacenar sus formateadores en un mapa hash. El hashmap es un miembro estático de su 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);
}
Ágora
fuente
9
¡¡CONSIDERACIÓN!! La idea es buena, pero la implementación no. Los DateFormats no deben almacenarse estáticamente, ¡porque no son seguros para subprocesos! Si se utilizan desde más de un hilo (y esto siempre es arriesgado con estática). FindBugs contiene un detector para esto (con el que contribuí inicialmente, después de que me mordieran . Ver dschneller.blogspot.com/2007/04/… :-))
Daniel Schneller
La entrada de tu blog es una lectura interesante :-) ¿Qué pasa si sincronizo el método parseDate en sí mismo? Sin embargo, 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, introduciría un cuello de botella.
Daniel Schneller
8

Convierta una fecha de cadena en 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
Ritesh Kaushik
fuente
3

Si bien de SimpleDateFormathecho funcionará para sus necesidades, también es posible que desee consultar Joda Time , que aparentemente es la base para la biblioteca Date renovada en Java 7. Aunque no la he usado mucho, no he escuchado nada más que cosas buenas. al respecto y si manipula extensamente las fechas en sus proyectos, probablemente valga la pena investigarlo.

James McMahon
fuente
1

Forma sencilla de formatear una fecha y convertirla en una 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);

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

Khalid Habib
fuente
1

Un Dateobjeto no tiene formato , es una representación. La fecha puede ser presentado por una Stringcon el formato que desee .

Por ejemplo, " yyyy-MM-dd", " yy-MMM-dd", " dd-MMM-yy" y etc.

Para lograr esto, puede obtener el uso de SimpleDateFormat

Prueba esto,

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

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

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

Esto produce: 2009-05-19

Dulith De Costa
fuente
1

Suponga que tiene una cadena como esta:

String mDate="2019-09-17T10:56:07.827088"

Ahora queremos cambiar este Stringformato por fecha y hora por separado en Java y Kotlin .

JAVA:

tenemos un método para extraer la fecha :

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return es esto: 17/09/2019

Y tenemos un método para extraer el tiempo :

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Returnes esto: 10:56 AM

KOTLIN:

tenemos una función para extraer la fecha :

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return es esto: 17/09/2019

Y tenemos un método para extraer el tiempo :

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

Returnes esto: 10:56 AM

milad salimi
fuente
Por favor, no enseñe a los jóvenes a usar la SimpleDateFormatclase obsoleta y notoriamente problemática . Al menos no como primera opción. Y no sin reserva alguna. Hoy tenemos mucho mejor en java.time, la API moderna de fecha y hora de Java, y su DateTimeFormatter. Tampoco SimpleDateFormatpuede analizar correctamente 6 decimales en los segundos (microsegundos).
Ole VV
Cuando ejecuto su segundo fragmento, no obtengo 10:56 AMlo que dice que debería, sino 11:09 AM(probado en Oracle jdk-11.0.3).
Ole VV
@ OleV.V. , Si un método está desactualizado por mucho tiempo, se desaprobará con una línea como signo, si un método o clase no está desaprobado, podemos usarlo, no digo que sea la mejor manera, tal vez tengamos una mejor manera, pero de esta manera es simple y comprensible, si un método o clase era antiguo, no hay ninguna razón por la que sea problemático y para el uso de DateTimeFormatternecesitamos minsdk 26o superior, entonces no es bueno
milad salimi
@ OleV.V. Pero gracias por su comentario y sobre su segundo comentario puedo decir que lo reviso muchas veces en dos aplicaciones y regresa10:56 AM
milad salimi
1
@ OleV.V. , Ok, pero uso una biblioteca cuando no tengo forma o esa API (biblioteca) es muy, mucho mejor que mi código, porque cuando agrega una biblioteca, agrega algunos códigos a su proyecto que pueden no usarse y esto es una sobrecarga para su proyecto, este es mi enfoque y su enfoque es respetable para mí.
milad salimi