Hora UTC + hora de Joda
Estoy tratando de obtener el UTC TimeStamp en un programa Java simple usando Joda:
public Timestamp getCurrentUTC(LocalDateTime date, DateTimeZone srcTZ, DateTimeZone dstTZ, Locale l) {
DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);
System.out.println("UTC Time:" + dstDateTime.getMillis());
System.out.println("UTC Time:" + new Timestamp(dstDateTime.getMillis()));
return new Timestamp(dstDateTime.getMillis());
}
La salida del programa es la siguiente:
UTC Time:1378265162047
UTC Time:2013-09-03 23:26:02.047
El valor de milisegundos es el tiempo UTC correcto (es decir, confirmado conGMT-4
zona horaria) El segundo valor es elEST
zona horaria.
Lo que necesito es el valor UTC sin cambios comojava.sql.Timestamp
(es decir, TZ independiente), para una base de datos de escritura. es posible?
DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);
System.out.println("UTC Time:" + dstDateTime.getMillis());
Yo sé esosrcDateTime
es la fecha local (GMT-4), ydstDateTime
es UTC (GMT-0). Los valores de salida de las fechas son los siguientes:
Source Date:2013-09-04T09:10:43.683-04:00
Destination Date: 2013-09-04T13:10:43.683Z
Probé todas las combinaciones para intentar obtener el valor UTC dedstDateTime
como java.sql.TimeStamp:
System.out.println("UTC Time:" + dstDateTime.getMillis());
System.out.println("UTC Time:" + new Timestamp(srcDateTime.toDateTime(DateTimeZone.UTC).getMillis()));
System.out.println("UTC Time:" + new Timestamp(dstDateTime.toDateTime(DateTimeZone.UTC).getMillis()));
La salida de impresión para la prueba:
UTC Time:1378298760226 - Correct UTC
UTC Time:2013-09-04 08:46:00.226 - Incorrect Local Date Time instead of the Expected UTC
UTC Time:2013-09-04 08:46:00.226 - Incorrect Local Date Time instead of the Expected UTC
La primera línea de impresión es la marca de tiempo UTC correcta. Todo lo que necesito es el mismo valor que el tipo java.sql.TimeStamp. Todo lo que probé siempre devolvió la fecha local de la máquina.
Editar 2Intenté lo siguiente:
System.out.println("UTC Timestamp:" + date.toDateTime(srcTZ).getMillis());
System.out.println("UTC Timestamp:" + new Timestamp(date.toDateTime(srcTZ).getMillis()));
La salida es la siguiente:
UTC Time:1378342856315 - Correct UTC Time
UTC Timestap:2013-09-04 21:00:56.315 - Local Time other than the expected UTC Time
Cada vez que intento convertir a TimeStamp, pierdo el valor UTC válido que busco.
En términos de los parámetros del método:
srcTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/Montreal")
dstTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Etc/UTC"))
Local l = new Locale("en", "CA")
Cualquier ayuda es muy apreciada.
Mella.
Editar 3Hola mate
Muchas gracias por su respuesta. Estamos obteniendo los mismos resultados que usted. No sabía nada sobre la impresión, etc. Más específicamente:
System.out.println("UTC Timestamp:" + srcDateTime.toDateTime(dstTZ).getMillis());
System.out.println("UTC Timestamp:" + srcDateTime.toDateTime(dstTZ));
System.out.println("UTC Timestamp:" + new Timestamp(srcDateTime.toDateTime(dstTZ).getMillis()));
Cede la salida:
UTC Timestamp:1378389098468 - Correct UTC Timestap (Thu, 05 Sep 2013 13:51:38 GMT)
UTC Timestamp:2013-09-05T13:51:38.468Z - Correct UTC Time
UTC Timestamp:2013-09-05 09:51:38.468 - Local time is printed, UTC is expected
El problema me llamó la atención cuando nos dimos cuenta de que el DB estaba almacenando la hora local en lugar de UTC:
+---------------------+
| effectivedate |
+---------------------+
| 2013-09-05 09:34:11 |
+---------------------+
La zona horaria Mysql se establece en '-00: 00'
mysql> SELECT CURRENT_TIMESTAMP;
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2013-09-05 13:48:09 |
+---------------------+
Al depurar la aplicación utilizando el depurador de eclipse, nos dimos cuenta de que la fecha y hora local (2013-09-05 09: 51: 38.468) se pasaba a la base de datos (No se pueden publicar imágenes, no hay suficientes puntos ...). El tipo de datos es TimeStamp directo, sin manipulación de cadenas. Tal vez el depurador de eclipse está utilizandoString.println()
funciona también, no estoy seguro ..
Realmente aprecio toda la ayuda depurando nuestra aplicación. No quería gastar tanto tiempo (sin juego de palabras) y esfuerzo ...
Saludos cordiales,
Mella.