¿Cómo obtener la marca de tiempo actual en formato de cadena en Java? "aaaa.MM.dd.HH.mm.ss"

Resuelto user3388884 asked hace 10 años • 10 respuestas

¿Cómo obtener una marca de tiempo en formato de cadena en Java? "aaaa.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

Esto es lo que tengo, pero Timestamp() requiere parámetros...

user3388884 avatar Apr 15 '14 02:04 user3388884
Aceptado

Reemplazar

new Timestamp();

con

new java.util.Date()

porque no existe un constructor predeterminado para Timestamp, o puedes hacerlo con el método:

new Timestamp(System.currentTimeMillis());
Jigar Joshi avatar Apr 14 '2014 19:04 Jigar Joshi

Utilice java.util.Dateclase en lugar de marca de tiempo.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new java.util.Date());

Esto le dará la fecha actual en el formato especificado.

dimoniy avatar Apr 14 '2014 19:04 dimoniy

tl; dr

Utilice sólo clases modernas de java.time . Nunca utilices las terribles clases heredadas como SimpleDateFormat, Dateo java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

O utilice la zona horaria predeterminada actual de la JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time y JDBC 4.2

El enfoque moderno utiliza las clases java.time como se ve arriba.

Si su controlador JDBC cumple con JDBC 4.2 , puede intercambiar objetos java.time directamente con la base de datos. Uso PreparedStatement::setObjecty ResultSet::getObject.

Utilice java.sql solo para controladores anteriores a JDBC 4.2

Si su controlador JDBC aún no cumple con JDBC 4.2 para admitir tipos java.time , debe volver a utilizar las clases java.sql.

Almacenamiento de datos.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;

Recuperando datos.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

Los tipos java.sql, como java.sql.Timestamp, solo deben usarse para transferencias dentro y fuera de la base de datos. Convierta inmediatamente a tipos java.time en Java 8 y versiones posteriores.

java.time.Instant

A java.sql.Timestampse asigna a java.time.Instantun momento en la línea de tiempo en UTC. Observe el nuevo método de conversión toInstantagregado a la clase anterior.

java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant(); 

Zona horaria

Aplique la zona horaria deseada/esperada ( ZoneId) para obtener un ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Cadenas formateadas

Utilice a DateTimeFormatterpara generar su cadena. Los códigos de patrón son similares a los de java.text.SimpleDateFormatpero no exactamente, así que lea el documento con atención.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Este formato en particular es ambiguo en cuanto a su significado exacto, ya que carece de indicación de desplazamiento desde UTC o zona horaria.

ISO 8601

Si tiene algo que decir al respecto, le sugiero que considere utilizar formatos estándar ISO 8601 en lugar de utilizar los suyos propios. El formato estándar es bastante similar al tuyo. Por ejemplo:
2016-02-20T03:26:32+05:30.

Las clases java.time utilizan estos formatos estándar de forma predeterminada, por lo que no es necesario especificar un patrón. La ZonedDateTimeclase amplía el formato estándar añadiendo el nombre de la zona horaria (una mejora inteligente).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Convertir a java.sql

Puede convertir de java.time a java.sql.Timestamp. Extraiga un Instantdel ZonedDateTime.

Se han agregado nuevos métodos a las clases antiguas para facilitar la conversión hacia/desde clases java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Tabla de tipos de fecha y hora en Java (tanto heredado como moderno) y en SQL estándar


Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases reemplazan a las antiguas y problemáticas clases de fecha y hora heredadas , como java.util.Date, Calendary 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 hay necesidad de cadenas, no hay necesidad de java.sql.*clases.

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 y posteriores: parte de la API de Java estándar con una implementación incluida.
  • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
  • La mayor parte de la funcionalidad 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 Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP… .

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como , Interval, y más .YearWeekYearQuarter

Basil Bourque avatar Feb 20 '2016 07:02 Basil Bourque

Utilice clases modernas java.timesi utiliza Java 8 o posterior.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

La respuesta de Basil Bourque es bastante buena. Pero es demasiado largo. Mucha gente no tendría paciencia para leerlo. Las 3 respuestas principales son demasiado antiguas y pueden engañar a la nueva abeja de Java. Por eso proporciono esta respuesta breve y moderna para los nuevos desarrolladores. Espero que esta respuesta pueda reducir el uso de terrible SimpleDateFormat.

gzc avatar Nov 13 '2019 03:11 gzc