UTC-Zeitstempel + Joda-Zeit
Ich versuche, den UTC-Zeitstempel in einem einfachen Java-Programm mit Joda abzurufen:
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());
}
Die Ausgabe des Programms ist wie folgt:
UTC Time:1378265162047
UTC Time:2013-09-03 23:26:02.047
Der Millisekundenwert ist die korrekte UTC - Zeit (d. H. Bestätigt mitGMT-4
Zeitzone) Der zweite Wert ist derEST
Zeitzone.
Was ich brauche, ist der UTC-Wert unverändert alsjava.sql.Timestamp
(dh TZ-unabhängig), für ein Datenbankschreiben. Ist das möglich?
DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);
System.out.println("UTC Time:" + dstDateTime.getMillis());
ich weiß dassrcDateTime
ist das lokale Datum (GMT-4) unddstDateTime
ist UTC (GMT-0). Die Ausgabewerte der Daten lauten wie folgt:
Source Date:2013-09-04T09:10:43.683-04:00
Destination Date: 2013-09-04T13:10:43.683Z
Ich habe alle Kombinationen ausprobiert, um den UTC-Wert von zu ermittelndstDateTime
als 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()));
Die Druckausgabe zum Testen:
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
Die erste Druckzeile enthält den korrekten UTC-Zeitstempel. Ich brauche nur den gleichen Wert wie java.sql.TimeStamp. Alles, was ich versuchte, gab immer das lokale Datum der Maschine zurück.
Bearbeiten 2Ich habe folgendes versucht:
System.out.println("UTC Timestamp:" + date.toDateTime(srcTZ).getMillis());
System.out.println("UTC Timestamp:" + new Timestamp(date.toDateTime(srcTZ).getMillis()));
Die Ausgabe ist wie folgt:
UTC Time:1378342856315 - Correct UTC Time
UTC Timestap:2013-09-04 21:00:56.315 - Local Time other than the expected UTC Time
Immer wenn ich versuche, nach TimeStamp zu konvertieren, verliere ich den gültigen UTC-Wert, den ich verfolge.
In Bezug auf die Parameter der Methode:
srcTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/Montreal")
dstTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Etc/UTC"))
Local l = new Locale("en", "CA")
Jede Hilfe wird sehr geschätzt.
Nick.
Bearbeiten 3Hallo Matt,
Vielen Dank für Ihre Antwort. Wir erzielen die gleichen Ergebnisse wie Sie. Wusste nicht, was es mit Drucken usw. auf sich hat. Genauer gesagt:
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()));
Ergibt die Ausgabe:
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
Ich wurde auf das Problem aufmerksam, als wir feststellten, dass die Datenbank die Ortszeit anstelle von UTC speichert:
+---------------------+
| effectivedate |
+---------------------+
| 2013-09-05 09:34:11 |
+---------------------+
Die MySQL-Zeitzone ist auf "-00: 00" eingestellt.
mysql> SELECT CURRENT_TIMESTAMP;
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2013-09-05 13:48:09 |
+---------------------+
Beim Debuggen der Anwendung mit dem Eclipse-Debugger haben wir festgestellt, dass die lokale Datumszeit (2013-09-05 09: 51: 38.468) an die DB übergeben wurde (Bilder können nicht gepostet werden, nicht genügend Punkte ...). Der Datentyp ist ein direkter TimeStamp-Datentyp ohne Manipulation von Zeichenfolgen. Möglicherweise verwendet der Eclipse-DebuggerString.println()
Funktion auch nicht sicher ..
Ich freue mich sehr über die Hilfe beim Debuggen unserer Anwendung. Wollte nicht so viel Zeit (kein Wortspiel beabsichtigt) und Mühe in Anspruch nehmen ...
Mit freundlichen Grüßen,
Nick.