Cómo obtener la fecha y hora actuales


342

¿Cómo obtengo la fecha y hora actuales en Java?

Estoy buscando algo que sea equivalente a DateTime.NowC #.


Esta pregunta es anterior a esta pregunta anteriormente marcada como duplicada. Así que invertí la designación, reabrí esta Pregunta y marqué la más nueva como duplicada.
Basil Bourque

Respuestas:


414

Simplemente construya un nuevo Dateobjeto sin ningún argumento; esto asignará la fecha y hora actuales al nuevo objeto.

import java.util.Date;

Date d = new Date();

En palabras de los Javadocs para el constructor de argumento cero :

Asigna un objeto Date y lo inicializa para que represente la hora a la que fue asignado , medido al milisegundo más cercano.

Asegúrese de estar usando java.util.Datey no java.sql.Date: este último no tiene un constructor de cero argumentos y tiene una semántica algo diferente que es el tema de una conversación completamente diferente. :)


13
También tenga en cuenta que GregorianCalendar y muchos objetos similares funcionan de la misma manera. Entonces, sea cual sea el tipo de objeto de fecha / calendario con el que esté trabajando, el constructor de argumento cero generalmente inicializa el objeto a la fecha / hora actual.
Peter Di Cecco

From Date doc: a partir de JDK 1.1, la clase Calendar debe usarse para convertir entre fechas y campos de tiempo y la clase DateFormat debe usarse para formatear y analizar cadenas de fechas.
Paolo M

99
Considere las nuevas API de Java8: LocalDateTime.now () y ZonedDateTime.now ()
Oleg Mikheev el

59

Muchos consideran que las clases Java Date y Calendar están mal diseñadas. Debería echar un vistazo a Joda Time , una biblioteca comúnmente utilizada en lugar de las bibliotecas de fechas incorporadas de Java.

El equivalente de DateTime.Nowen Joda Time es:

DateTime dt = new DateTime();

Actualizar

Como se señaló en los comentarios, las últimas versiones de Joda Time tienen un DateTime.now()método, por lo que:

DateTime dt = DateTime.now();

44
La versión actual (2.1) de Joda parece tener un método estático DateTime.now () (opcionalmente acepta DateTimeZone o Chronology). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher

1
Tenga en cuenta que esta respuesta se publicó en 2010. Java 8 ha absorbido muchas de las mejores características de Joda Time. Consulte la documentación oficial y muchos otros artículos en línea para obtener más información.
DavidS

36

tl; dr

Instant.now()

java.time

La clase java.util.Date ha quedado anticuada por el nuevo paquete java.time ( Tutorial ) en Java 8 y versiones posteriores. Las antiguas clases java.util.Date/.Calendar son notoriamente problemáticas, confusas e imperfectas. Evítales.

ZonedDateTime

Obtenga el momento actual en java.time.

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTimeencapsula:

  • Fecha.
  • Hora del día, con una fracción de resolución de segundo a nanosegundo .
  • Zona horaria.

Si no se especifica una zona horaria, la zona horaria predeterminada actual de su JVM se asigna silenciosamente. Es mejor especificar su zona horaria deseada / esperada que confiar implícitamente en el valor predeterminado.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

En general, es mejor acostumbrarse a hacer su trabajo de back-end (lógica de negocios, base de datos, almacenamiento, intercambio de datos) todo en la zona horaria UTC . El código anterior se basa implícitamente en la zona horaria predeterminada actual de la JVM.

La Instantclase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos.

Instant instant = Instant.now();

La Instantclase es una clase básica de bloques de construcción en java.time y se puede usar a menudo en su código.

Cuando necesite más flexibilidad en el formato, transfórmese en un OffsetDateTime. Especifica un ZoneOffsetobjeto. Para UTC, use la constante útil para UTC .

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

Zona horaria

Se ajusta fácilmente a otra zona horaria para presentarla al usuario. Use un nombre de zona horaria adecuado , nunca los códigos de 3-4 letras como ESTo IST.

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

Genere una representación de cadena de ese valor de fecha y hora, localizado.

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

Instant

O, para permanecer en UTC, use Instant. Un Instantobjeto representa un momento en la línea de tiempo, a una resolución de nanosegundos, siempre en UTC. Esto proporciona el bloque de construcción para una fecha y hora zonificada, junto con una asignación de zona horaria. Puedes pensarlo conceptualmente de esta manera:

ZonedDateTime= Instant+ZoneId

Puede extraer un Instantde a ZonedDateTime.

Instant instantNow = zdt.toInstant();

Puedes comenzar con un Instant. No es necesario especificar una zona horaria aquí, como Instantsiempre es en UTC.

Instant now = Instant.now();

También publiqué otra respuesta con más detalles en una pregunta duplicada.
Basil Bourque



12
import java.util.Date;   
Date now = new Date();

Tenga en cuenta que el objeto Date es mutable y si desea hacer algo sofisticado, use jodatime .


10

java.lang.System.currentTimeMillis(); devolverá la fecha y hora desde la época


Bueno para iniciar sesión, pero requiere análisis y conversión para mostrar al usuario
Rishi Dua

6
import org.joda.time.DateTime;

DateTime now = DateTime.now();

5

Si crea un nuevo objeto Fecha, de forma predeterminada se establecerá en la hora actual:

import java.util.Date;
Date now = new Date();

3

Java siempre ha tenido un soporte inadecuado para los casos de uso de fecha y hora. Por ejemplo, las clases existentes (como java.util.Datey SimpleDateFormatter) no son seguras para subprocesos, lo que puede provocar problemas de concurrencia. También hay ciertos defectos en la API. Por ejemplo, los años que java.util.Datecomienzan en 1900, los meses comienzan en 1 y los días comienzan en 0, lo que no es muy intuitivo. Estos problemas llevaron a la popularidad de las bibliotecas de fecha y hora de terceros, como Joda-Time. Para abordar una nueva fecha y hora, la API está diseñada para Java SE 8.

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

Según el documento :

El método now()devuelve la fecha y hora actual utilizando el reloj del sistema y la zona horaria predeterminada, no nulo . Obtiene la fecha y hora actual del reloj del sistema en la zona horaria predeterminada. Esto consultará el reloj del sistema en la zona horaria predeterminada para obtener la fecha y hora actual. El uso de este método impedirá la posibilidad de usar un reloj alternativo para las pruebas porque el reloj está codificado.

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.