web-dev-qa-db-ja.com

Joda Timeはタイムゾーンされた日付時刻をミリ秒に変換します

誰かが自分のゾーンとは異なるゾーンで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時間と同じ日付時間を持つべきだと思ったでしょうか?

22
cianBuckley

いくつかのポイント:

  • 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());
_
19