Joda を使用して単純な Java プログラムで UTC タイムスタンプを取得しようとしています。
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());
}
プログラムの出力は次のとおりです。
UTC Time:1378265162047
UTC Time:2013-09-03 23:26:02.047
ミリ秒の値は正しい UTC 時間です (つまり、GMT-4
タイムゾーンで確認されます)。2 番目の値はEST
タイムゾーンです。
私が必要とするのはjava.sql.Timestamp
、データベースの書き込みのために、変更されていない (つまり、TZ に依存しない) UTC 値です。これは可能ですか?
編集 1
DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);
System.out.println("UTC Time:" + dstDateTime.getMillis());
srcDateTime
それが現地の日付 (GMT-4) であり、dstDateTime
UTC (GMT-0)であることはわかっています。日付の出力値は次のとおりです。
Source Date:2013-09-04T09:10:43.683-04:00
Destination Date: 2013-09-04T13:10:43.683Z
すべての組み合わせを試して、UTC 値をdstDateTime
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()));
テスト用の印刷出力:
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
最初の印刷行は正しい UTC タイムスタンプです。必要なのは、タイプ java.sql.TimeStamp と同じ値だけです。私が試したものは、常にマシンのローカル日時を返しました。
編集 2
私は次のことを試しました:
System.out.println("UTC Timestamp:" + date.toDateTime(srcTZ).getMillis());
System.out.println("UTC Timestamp:" + new Timestamp(date.toDateTime(srcTZ).getMillis()));
出力は次のとおりです。
UTC Time:1378342856315 - Correct UTC Time
UTC Timestap:2013-09-04 21:00:56.315 - Local Time other than the expected UTC Time
TimeStamp に変換しようとすると、取得した有効な UTC 値が失われます。
メソッドのパラメーターに関しては、次のとおりです。
srcTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/Montreal")
dstTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Etc/UTC"))
Local l = new Locale("en", "CA")
どんな助けでも大歓迎です。
ニック。
編集 3
マットさん、こんにちは。
ご回答ありがとうございます。私たちはあなたと同じ結果を得ています。印刷などについて知りませんでした。より具体的には:
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()));
出力が得られます:
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
DB が UTC ではなく現地時間を格納していることに気付いたとき、この問題に気付きました。
+---------------------+
| effectivedate |
+---------------------+
| 2013-09-05 09:34:11 |
+---------------------+
Mysql のタイムゾーンは「-00:00」に設定されています
mysql> SELECT CURRENT_TIMESTAMP;
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2013-09-05 13:48:09 |
+---------------------+
Eclipse デバッガーを使用してアプリケーションをデバッグすると、ローカルの日時 (2013-09-05 09:51:38.468) が DB に渡されていることがわかりました (画像を投稿できない、ポイントが足りない...)。データ型はそのままの TimeStamp で、文字列操作はありません。EclipseデバッガーもString.println()
関数を使用している可能性がありますが、わかりません..
アプリケーションのデバッグにご協力いただき、誠にありがとうございます。それほど多くの時間 (しゃれた意図はありません) と労力を費やしたくありませんでした...
敬具、
ニック。