tl; dr
Instant.now() // Capture the current moment in UTC.
Genere una cadena para representar ese valor:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Detalles
Como dijo la respuesta correcta de Jon Skeet , un objeto java.util.Date no tiene zona horaria † . Pero su toString
implementación aplica la zona horaria predeterminada de la JVM al generar la representación de cadena de ese valor de fecha y hora. Confusamente para el programador ingenuo, una Fecha parece tener una zona horaria pero no la tiene.
Las java.util.Date
, j.u.Calendar
y java.text.SimpleDateFormat
las clases que vienen con Java son notoriamente molesto. Evítales. En su lugar, use cualquiera de estas bibliotecas de fecha y hora competentes:
java.time (Java 8)
Java 8 trae un excelente nuevo paquete java.time. * Para suplantar las antiguas clases java.util.Date/Calendar.
Obtener la hora actual en UTC / GMT es una línea simple ...
Instant instant = Instant.now();
Esa Instant
clase es el bloque de construcción básico en java.time, que representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos .
En Java 8, el momento actual se captura con solo una resolución de hasta milisegundos. Java 9 ofrece una nueva implementación de Clock
capturas del momento actual hasta la capacidad completa de nanosegundos de esta clase, dependiendo de la capacidad del hardware del reloj de la computadora host.
Su toString
método genera una representación de cadena de su valor utilizando un formato ISO 8601 específico . Ese formato genera cero, tres, seis o nueve dígitos dígitos ( milisegundos , microsegundos o nanosegundos ) según sea necesario para representar la fracción de segundo.
Si desea un formato más flexible u otras características adicionales, aplique un desplazamiento desde UTC de cero, para que UTC mismo ( ZoneOffset.UTC
constante ) obtenga un OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Volcado a la consola ...
System.out.println( "now.toString(): " + now );
Cuando corres ...
now.toString(): 2014-01-21T23:42:03.522Z
Sobre 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
.
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 .
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
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?
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 .
Joda-Time
ACTUALIZACIÓN: El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Utilizando la biblioteca gratuita de código abierto de terceros de Joda-Time , puede obtener la fecha y hora actual en una sola línea de código.
Joda-Time inspiró las nuevas clases java.time. * En Java 8, pero tiene una arquitectura diferente. Puede usar Joda-Time en versiones anteriores de Java. Joda-Time continúa trabajando en Java 8 y continúa manteniéndose activamente (a partir de 2014). Sin embargo, el equipo de Joda-Time aconseja la migración a java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Código de ejemplo más detallado (Joda-Time 2.3) ...
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Volcado a la consola ...
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Cuando corres ...
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Para obtener más ejemplos de código que funcionan en zonas horarias, consulte mi respuesta a una pregunta similar.
Zona horaria
Le recomiendo que siempre especifique una zona horaria en lugar de depender implícitamente de la zona horaria predeterminada actual de la JVM (¡que puede cambiar en cualquier momento!). Tal confianza parece ser una causa común de confusión y errores en el trabajo de fecha y hora.
Al llamar, now()
pase la zona horaria deseada / esperada que se asignará. Usa la DateTimeZone
clase.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Esa clase tiene una constante para la zona horaria UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Si realmente desea utilizar la zona horaria predeterminada actual de la JVM, realice una llamada explícita para que su código se documente automáticamente.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Lea sobre los formatos ISO 8601 . Tanto java.time como Joda-Time usan los formatos sensibles de ese estándar como sus valores predeterminados para analizar y generar cadenas.
† En realidad, java.util.Date hace tener una zona horaria, profundamente enterrado bajo capas de código fuente. Para los propósitos más prácticos, esa zona horaria se ignora. Entonces, como taquigrafía, decimos que java.util.Date no tiene zona horaria. Además, esa zona horaria enterrada no es la utilizada por el toString
método de Date ; ese método usa la zona horaria predeterminada actual de la JVM. Razón de más para evitar esta clase confusa y seguir con Joda-Time y java.time.