Convierta java.util.Date a String


407

Quiero convertir un java.util.Dateobjeto en a Stringen Java.

El formato es 2010-05-30 22:15:52



@harschware FYI, el proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo aconseja migrar a las clases java.time . Ver Tutorial de Oracle .
Basil Bourque

1
Te recomiendo que no uses y Dateen 2019. Esa clase está mal diseñada y obsoleta desde hace mucho tiempo. En su lugar, use Instantu otra clase de java.time, la API de fecha y hora moderna de Java .
Ole VV

Respuestas:


757

Convierta una fecha en una cadena utilizando el DateFormat#formatmétodo:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

De http://www.kodejava.org/examples/86.html


25
¿Por qué usar en Calendarlugar de simple new Date()? ¿Hay diferencia?
Alexander Malakhov

10
Cuidado: SimpleDateFormat no es seguro para subprocesos. stackoverflow.com/questions/6840803/…
Zags

23
El calendario es una clase abstracta, la fecha es concreta. Date no tiene idea acerca de TimeZone, Locale o cualquiera de esas cosas buenas que nunca usamos.
nckbrz

30
El MM/dd/yyyyformato es estúpido y roto. No lo uses. Siempre use dd/MM/yyyyo yyyy-MM-dd.
SystemParadox

13
@SystemParadox: es estúpido, pero eso no lo hace inútil. Me pidieron específicamente que lo use porque coincide con lo que la gente espera en los informes. (Prefiero en yyyy-MM-ddtodas partes, pero ¿qué puedes hacer?).
Otoño Leonard

223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);

63

Commons-lang DateFormatUtils está lleno de golosinas (si tienes commons-lang en tu classpath)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

Requiere un nullcheque adicional .
Farrukh Chishti

23

tl; dr

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

La forma moderna es con las clases java.time que ahora suplantan a las antiguas clases problemáticas de fecha y hora heredadas.

Primero convierta su java.util.Datea un Instant. 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).

Las conversiones hacia / desde java.time se realizan mediante nuevos métodos agregados a las clases antiguas.

Instant instant = myUtilDate.toInstant();

Tanto tu java.util.Datecomo java.time.Instantestás en UTC . Si desea ver la fecha y la hora como UTC, que así sea. Llame toStringpara generar una cadena en formato estándar ISO 8601 .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Para otros formatos, debe transformar su Instanten el más flexible OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

Vea ese código en vivo en IdeOne.com .

Para obtener una cadena en el formato deseado, especifique a DateTimeFormatter. Puede especificar un formato personalizado. Pero usaría uno de los formateadores predefinidos ( ISO_LOCAL_DATE_TIME) y reemplazaría el Ten su salida con un ESPACIO.

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Por cierto, no recomiendo este tipo de formato en el que pierdes intencionalmente la información de compensación de UTC o zona horaria. Crea ambigüedad en cuanto al significado del valor de fecha y hora de esa cadena.

También tenga cuidado con la pérdida de datos, ya que cualquier segundo fraccionario se ignora (se trunca efectivamente) en la representación de su Cadena del valor de fecha y hora.

Para ver ese mismo momento a través de la lente del reloj de pared de una región en particular , aplique a ZoneIdpara obtener a ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [América / Montreal]

Para generar una cadena formateada, haga lo mismo que arriba pero reemplace odtcon zdt.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Si ejecuta este código una gran cantidad de veces, es posible que desee ser un poco más eficiente y evitar la llamada String::replace. Descartar esa llamada también hace que su código sea más corto. Si lo desea, especifique su propio patrón de formato en su propio DateTimeFormatterobjeto. Caché esta instancia como una constante o miembro para su reutilización.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Aplique ese formateador pasando la instancia.

String output = zdt.format( f );

Sobre java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases sustituyen a las clases de fecha y hora viejas problemáticas tales como java.util.Date, .Calendar, y java.text.SimpleDateFormat.

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time.

Para obtener más información, vea el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.

Gran parte de la funcionalidad java.time se transfiere a Java 6 y 7 en ThreeTen-Backport y se adapta aún más a Android en ThreeTenABP (consulte Cómo usar ... ).

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time.


Aquí hay ejemplos de código de formato con Java 8 Time API: stackoverflow.com/a/43457343/603516
Vadzim

este código no funciona OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 ¿Hay un nuevo código Java 8 que tenga el mismo formato 2014-11-14T14: 05: 09 + 00: 00? Gracias
Bob Bolden

@BobBolden Tienes razón, Zse usa en lugar de +00:00por defecto. Arregle la respuesta, gracias. FYI, esos significan lo mismo: Zpronunciado "Zulu" significa un desplazamiento de cero horas-minutos-segundos, lo mismo que +00:00. El estándar ISO 8601 es compatible con ambos estilos.
Basil Bourque

@BasilBourque lo siento, esto no está claro. Tengo Java 8 y no hay instant.atOffset () en absoluto. ¿Podría aconsejar cuál debería ser el código correcto para que Java 8 tenga exactamente el mismo formato 2014-11-14T14: 05: 09 + 00: 00 sin instant.atOffset ()? Estoy un poco perdido :(
Bob Bolden

@BobBolden En efecto, existe un atOffsetmétodo en Instantla clase en Java 8. Véase Javadoc: Instant::atOffset. En Java 8, Instant.now().atOffset( ZoneOffset.UTC ).toString()se ejecutará una llamada como . Revisa tus importdeclaraciones. Verifique que su IDE / proyecto esté configurado para ejecutar Java 8 o posterior en lugar de una versión anterior de Java. Vea el código en vivo en IdeOne.com: ideone.com/2Vm2O5
Basil Bourque

19

Trazos alternativos en Java simple:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

Esto utiliza formateador e indexación relativa en lugar de SimpleDateFormatque no sea seguro para subprocesos , por cierto.

Ligeramente más repetitivo pero solo necesita una declaración. Esto puede ser útil en algunos casos.


1
Esto es (in) genio. Rendimiento mucho mejor para entornos restringidos
Ruslan

9

¿Por qué no usas Joda (org.joda.time.DateTime)? Básicamente es una frase.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

Sugiero pasar también una DateTimeZone, en lugar de asignar la zona horaria predeterminada actual de la JVM al DateTimeobjeto. new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque

7

Parece que estás buscando SimpleDateFormat .

Formato: aaaa-MM-dd kk: mm: ss


¿El "kk" hace algo especial? Creo que Eric lo quiere en 24 horas.
Charlie Sales

2
Sí, la hora del día (1-24), pero esto probablemente no sea lo que necesita el OP. HH(0-23) es más común.
BalusC

1
@Cahrlie Salts kk va de 1-24, donde HH va de 0-23, y probablemente fue un poco presuntuoso de mi parte suponer que quería 1-24 @BalusC El objeto DateFormat analiza y formatea.
pickypg

No entiendo la relevancia de tu último comentario. Mi comentario fue a Charlie.
BalusC

Estoy acostumbrado a los formatos .Net, donde HH es 24 horas y hh es am / pm. De ahí el rascarse la cabeza.
Charlie Sales

5

En un solo disparo;)

Para obtener la fecha

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

Para obtener el tiempo

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

Para obtener la fecha y hora

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Feliz codificación :)


1
FYI, las viejas clases problemáticas 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

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

La forma más fácil de usarlo es la siguiente:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

donde "aaaa-MM-dd'T'HH: mm: ss" es el formato de la fecha de lectura

salida: dom abr 14 16:11:48 EEST 2013

Notas: HH vs hh - HH se refiere al formato de 24 h - hh se refiere al formato de 12 h


La pregunta es sobre la conversión opuesta.
Vadzim

4

Si solo necesita el tiempo desde la fecha, puede usar la función de Cadena.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

Esto cortará automáticamente la parte de tiempo de la cadena y la guardará dentro de timeString.


Esto puede romperse con una configuración regional diferente.
Vadzim

4

Estos son ejemplos del uso de la nueva API Java 8 Time para formatear el legado java.util.Date :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

Es bueno DateTimeFormatterque se pueda almacenar en caché de manera eficiente ya que es seguro para subprocesos (a diferencia SimpleDateFormat).

Lista de fomatters predefinidos y referencia de notación de patrón .

Créditos

¿Cómo analizar / formatear fechas con LocalDateTime? (Java 8)

Java8 conversión java.util.Date a java.time.ZonedDateTime

Formato instantáneo a cadena

¿Cuál es la diferencia entre java 8 ZonedDateTime y OffsetDateTime?


2

Prueba esto,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Salida:

2013-05-14 17:07:21

Para obtener más información sobre el formato de fecha y hora en java, consulte los enlaces a continuación

Centro de ayuda de Oracle

Ejemplo de fecha y hora en java


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

Intentemos esto

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

O una función de utilidad

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

De convertir fecha a cadena en Java


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String

1
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

1

Opción de una línea

Esta opción obtiene una línea sencilla para escribir la fecha real.

Tenga en cuenta que esto está usando Calendar.classy SimpleDateFormat, y luego no es lógico usarlo en Java8.

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

1
Para su información, las clases de fecha y hora terriblemente problemáticas como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Basil Bourque

1
(1) La respuesta es incorrecta (¿Acabo de recibir 2019-20-23 09:20:22- mes 20 ??) (2) No puedo ver que la respuesta proporcione algo que no esté cubierto en otras respuestas. (3) Por favor, no enseñe a los jóvenes a usar la SimpleDateFormatclase desactualizada y notoriamente problemática . Al menos no como la primera opción. Y no sin ninguna reserva. Hoy tenemos mucho mejor en java.timela moderna API de fecha y hora de Java, y su DateTimeFormatter.
Ole VV

Sí ... cometí un error y olvido corregirlo. Lo agregué rápidamente, y no lo recordaba ... lo siento !! y gracias por sus comentarios chicos
Alejandro Teixeira Muñoz

@ OleV.V. No todo el mundo tiene acceso a la API de datos y tiempo de Java moderno ... así que ... También es válida esta respuesta ...
Alejandro Teixeira Muñoz

1
Gracias por tu comentario. Si desea proporcionar una respuesta para Java 5, o para Java 6 y 7 sin ninguna dependencia externa, muy bien, eso es bienvenido, solo explique que eso es lo que está haciendo. Y su respuesta sigue siendo incorrecta, recibirá sorpresas en Año Nuevo.
Ole VV
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.