誰かが自分のゾーンとは異なるゾーンでDateTimeのミリ秒を取得しようとすると、ローカルマシンのタイムゾーンのミリ秒が返される理由を教えてもらえますか? UTCのミリ秒を取得しようとしていますが、アプリケーションのローカル設定はESTに設定されています(実際にはアイルランドにいるのですが;))
これがコードです:
DateTimeFormatter format = DateTimeFormat.mediumDateTime();
DateTime local = new DateTime();
DateTime utc = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC);
System.out.println("utc zone = " +utc.getZone());
System.out.println("UTC time: " + utc);
long current = utc.getMillis();
System.out.println("current: " + format.print(current));
System.out.println("local: " + format.print(local.getMillis()));
これが出力するものです:
utc zone = UTC
UTC time: 2013-08-16T13:36:32.444Z
current: Aug 16, 2013 9:36:32 AM
local: Aug 16, 2013 9:36:32 AM
現在、私はそれがUTC時間と同じ日付時間を持つべきだと思ったでしょうか?
いくつかのポイント:
System.currentTimeMillis()
を呼び出す必要はありません。これを渡すだけです:_ DateTime utc = new DateTime(DateTimeZone.UTC);
_
.getMillis()
を呼び出すと、結果はUTCでalwaysになります。時間をUTCベースではない整数として表すことは悪い考えであり、Joda Timeが提供するものではありません。ミリ秒がローカルタイムゾーンの影響を受けるという評価は正しくありません。
変換エラーは、_format.print
_の呼び出し方法が原因です。整数を渡す場合、デフォルトの動作では、現在のタイムゾーン、つまり現地時間を使用します。次のように変更できます。
_ format.withZone(DateTimeZone.UTC).print(current)
_
DateTime
を渡すと、そのタイムゾーン情報が自動的に適用されます。_ format.print(utc)
format.print(local)
_
まとめると、全体は次のようになります。
_DateTime local = new DateTime();
DateTime utc = new DateTime(DateTimeZone.UTC);
System.out.println("local zone = " + local.getZone());
System.out.println(" utc zone = " + utc.getZone());
DateTimeFormatter format = DateTimeFormat.mediumDateTime();
System.out.println(" local: " + format.print(local));
System.out.println(" utc: " + format.print(utc));
System.out.println("millis: " + utc.getMillis());
_