23

自分のゾーンとは異なるゾーンで 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 時間と同じ日時にする必要があると思いましたか?

4

1 に答える 1

21

いくつかのポイント:

  • 電話する必要はありませんSystem.currentTimeMillis()。これを渡すだけです:
    DateTime utc = new DateTime(DateTimeZone.UTC);
  • 呼び出すと.getMillis()、結果は常にUTC になります。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());
于 2013-08-16T17:54:23.630 に答える