Pregunta Cómo obtener la fecha / hora actual en Java


¿Cuál es la mejor manera de obtener la fecha / hora actual en Java?


526
2018-03-03 01:48


origen


Respuestas:


Depende de la forma de fecha / hora que desee:

  • Si desea la fecha / hora como un valor numérico único, entonces System.currentTimeMillis() te da eso, expresado como el número de milisegundos después del UNIX epoch (como Java) long) Este valor es un delta desde un punto de tiempo UTC, y es independiente de la zona horaria local ... suponiendo que el reloj del sistema se ha configurado correctamente.

  • Si desea la fecha / hora en un formulario que le permita acceder numéricamente a los componentes (año, mes, etc.), puede usar uno de los siguientes:

    • new Date() te da un Date objeto inicializado con la fecha / hora actual. El problema es que Date Los métodos API son en su mayoría defectuosos ... y obsoletos.

    • Calendar.getInstance() te da un Calendar objeto inicializado con la fecha / hora actual, utilizando el valor predeterminado Locale y TimeZone. Otras sobrecargas le permiten usar un Locale y / o TimeZone. El calendario funciona ... pero las API siguen siendo engorrosas.

    • new org.joda.time.DateTime() te da un Joda-tiempo objeto inicializado con la fecha / hora actual, utilizando la zona horaria predeterminada y la cronología. Hay muchas otras alternativas de Joda ... demasiadas para describir aquí. (Pero tenga en cuenta que algunas personas informan que el tiempo de Joda tiene problemas de rendimiento, p. El LocalDateTime de Jodatime es lento cuando se usa por primera vez.)

    • en Java 8, llamando LocalDateTime.now() y ZonedDateTime.now() te dará representaciones1 para la fecha / hora actual.

Antes de Java 8, la mayoría de las personas que conocen estas cosas se recomienda Joda-tiempo como tener (de lejos) las mejores API de Java para hacer cosas que implican cálculos de punto de tiempo y duración. Con Java 8, esto ya no es verdad. Sin embargo, si ya está usando el tiempo Joda en su base de código, no hay una fuerte2 razón para migrar


1 - Tenga en cuenta que LocalDateTime no incluye una zona horaria. Como dice el javadoc: "No puede representar un instante en la línea de tiempo sin información adicional, como un desplazamiento o zona horaria".

2 - Su código no se romperá si no lo hace, y no recibirá advertencias de depreciación. Claro, la base de código de Joda probablemente dejará de recibir actualizaciones, pero es poco probable que las necesite. Sin actualizaciones significa estabilidad y eso es bueno cosa.


526
2018-03-03 02:13



Si solo necesita imprimir una marca de tiempo en el formato AAAA.MM.DD-HH.MM.SS (caso muy frecuente), entonces esta es la manera de hacerlo:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());

340
2017-08-05 09:08



Si desea la fecha actual como Cadena, intente esto:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));

o

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/


90
2017-10-07 06:04



En Java 8 es:

LocalDateTime.now()

y en caso de que necesite información de zona horaria:

ZonedDateTime.now()

y en caso de que desee imprimir una cadena con formato de lujo:

System.out.println(ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME))

53
2017-10-06 22:30



Solo crea un objeto Date ...

Date date = new Date();

40
2018-03-03 01:52



    // 2015/09/27 15:07:53
    System.out.println( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 15:07:53
    System.out.println( new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 09/28/2015
    System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));

    // 20150928_161823
    System.out.println( new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()) );

    // Mon Sep 28 16:24:28 CEST 2015
    System.out.println( Calendar.getInstance().getTime() );

    // Mon Sep 28 16:24:51 CEST 2015
    System.out.println( new Date(System.currentTimeMillis()) );

    // Mon Sep 28
    System.out.println( new Date().toString().substring(0, 10) );

    // 2015-09-28
    System.out.println( new java.sql.Date(System.currentTimeMillis()) );

    // 14:32:26
    Date d = new Date();
    System.out.println( (d.getTime() / 1000 / 60 / 60) % 24 + ":" + (d.getTime() / 1000 / 60) % 60 + ":" + (d.getTime() / 1000) % 60 );

    // 2015-09-28 17:12:35.584
    System.out.println( new Timestamp(System.currentTimeMillis()) );

    // Java 8

    // 2015-09-28T16:16:23.308+02:00[Europe/Belgrade]
    System.out.println( ZonedDateTime.now() );

    // Mon, 28 Sep 2015 16:16:23 +0200
    System.out.println( ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME) );

    // 2015-09-28
    System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class

    // 16
    System.out.println( LocalTime.now().getHour() );

    // 2015-09-28T16:16:23.315
    System.out.println( LocalDateTime.now() );

33
2017-11-06 09:38



Utilizar:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp );

(Esta funcionando.)


18
2018-03-18 10:44



tl; dr

Instant.now()                                         // Capture the current moment in UTC, with a resolution of nanoseconds.

... o ...

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )  // Capture the current moment as seen in the wall-clock time used by the people of a particular region (a time zone).

java.time

Algunas de las respuestas mencionan que java.time las clases son el reemplazo moderno de las problemáticas y viejas clases heredadas de fecha y hora incluidas con las primeras versiones de Java. A continuación hay un poco más de información.

Zona horaria

Las otras respuestas no explican cómo un huso horario es crucial para determinar la fecha y la hora actuales. Para cualquier momento dado, la fecha y el tiempo varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche es un nuevo día en París, Francia mientras sigue siendo "ayer" en Montreal, Quebec.

Instant

Gran parte de su lógica comercial y almacenamiento / intercambio de datos debe hacerse en UTC, como una mejor práctica. Para obtener el momento actual en UTC con una resolución en nanosegundos, utilizar Instant clase.

Instant instant = Instant.now();

ZonedDateTime

Puedes ajustar eso Instant en otras zonas horarias. Aplicar un ZoneId objeto para obtener un ZonedDateTime.

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

Podemos omitir el Instant y obtener la corriente ZonedDateTime directamente.

ZonedDateTime zdt = ZonedDateTime.now( z );

Siempre pase ese argumento de zona horaria opcional. Si se omite, se aplica la zona horaria predeterminada actual de su JVM. El valor predeterminado puede cambiar a alguna momento, incluso durante tiempo de ejecución No someta su aplicación a una externalidad fuera de su control. Siempre especifique la zona horaria deseada / esperada.

ZonedDateTime do_Not_Do_This = ZonedDateTime.now(); // BAD - Never rely implicitly on the current default time zone.

Luego puede extraer un Instant desde el ZonedDateTime.

Instant instant = zdt.toInstant();

Siempre use una Instant o ZonedDateTime preferible a LocalDateTime cuando quieres un momento real en la línea de tiempo. los Local… los tipos a propósito no tienen ningún concepto de zona horaria, por lo que representan solo una idea aproximada de un posible momento. Para obtener un momento real, debe asignar un huso horario para transformar el Local… tipos en una ZonedDateTime y de ese modo hacerlo significativo.

LocalDate

los LocalDate class representa un valor de solo fecha sin hora del día y sin zona horaria.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );  // Always pass a time zone.

Instrumentos de cuerda

Para generar una cadena que represente el valor de la fecha y hora, simplemente llame toString en las clases java.time para el estándar ISO 8601 formatos.

String output = myLocalDate.toString();  // 2016-09-23

... o ...

String output = zdt.toString();  // 2016-09-23T12:34:56.789+03:00[America/Montreal]

los ZonedDateTime class amplía el formato estándar añadiendo sabiamente el nombre de la zona horaria entre corchetes.

Para otros formatos, busque Desbordamiento de pila para muchas preguntas y respuestas en el DateTimeFormatter clase.

Evitar LocalDateTime

Contrario al comentario sobre la Pregunta de RamanSB, deberías no utilizar LocalDateTime clase para la fecha-hora actual.

los LocalDateTime deliberadamente carece de cualquier zona horaria o información de desplazamiento de UTC. Entonces esto es no apropiado cuando estás rastreando un momento específico en la línea de tiempo. Ciertamente no apropiado para capturar el momento actual.

La redacción "Local" es contra intuitiva. Significa alguna localidad en lugar de cualquier localidad específica. Por ejemplo, la Navidad de este año comienza a la medianoche del 25 de diciembre: 2017-12-25T00:00:00, para ser representado como un LocalDateTime. Pero esto significa medianoche en varios puntos del mundo en diferentes momentos. La medianoche sucede primero en Kiribati, más tarde en Nueva Zelanda, horas más tarde en la India, y así sucesivamente, con varias horas más antes de que comience la Navidad en Francia, cuando los niños en Canadá todavía están esperando ese día. Cada uno de estos puntos de inicio de Navidad estaría representado por separado ZonedDateTime.


Desde fuera de tu sistema

Si no puede confiar en el reloj de su sistema, consulte Java: Obtenga la fecha y hora actuales del servidor, no del reloj del sistema y mi respuesta.

photo of a couple of external radio clock devices

java.time.Clock

Para aprovechar un proveedor alternativo del momento actual, escriba una subclase del resumen java.time.Clock clase.

Puedes pasar tu Clock implementación como argumento para los diversos java.time métodos. Por ejemplo, Instant.now( clock ).

Instant instant = Instant.now( yourClockGoesHere ) ;

Para fines de prueba, tenga en cuenta las implementaciones alternativas de Clock disponible estáticamente desde Clock sí mismo: fixed, offset, tick, y más.


Acerca de java.time

los java.time framework está integrado en Java 8 y posterior. Estas clases suplantan a los viejos problemas legado clases de fecha y hora como java.util.Date, Calendar, Y SimpleDateFormat.

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

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

Puedes intercambiar java.time objetos directamente con su base de datos. Usar una Controlador JDBC quejarse con JDBC 4.2 o después. Sin necesidad de cadenas, sin necesidad de java.sql.* clases

¿Dónde obtener las clases de java.time?

  • Java SE 8, Java SE 9, y después
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior, el ThreeTenABP proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP ....

los ThreeTen-Extra proyecto extiende 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, YearQuartery Más.


17
2017-09-07 21:40