2013-08-16 13 views
18

誰かが自分のゾーンと異なるゾーンでDateTimeのミリ秒を取得しようとすると、なぜローカルマシンのタイムゾーンのミリ秒が返ってくるのですか?ジョーダタイム変換時のゾーン時間をミリ秒に換算する

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のミリ秒を取得するために探していますが、アプリケーションの私の地元の設定がESTに設定されている(私はアイルランドで実際てるにもかかわらず)それは何を印刷する:

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時間と同じ日付時間を持つべきだと思いますか?

+0

あなた 'local'と' utc'は(のみ付属異なるタイムゾーンで)、時間の同じ瞬間を表します。したがって、 'getMillis()'(Unixエポックに対応する「インスタント」からの "物理的な"時間間隔を与える)は、同じ値を返さなければなりません。 – leonbloy

答えて

16

いくつかのポイント:

  • あなたはSystem.currentTimeMillis()を呼び出す必要はありません。あなたが.getMillis()を呼び出すと、結果は常にUTCである
DateTime utc = new DateTime(DateTimeZone.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()); 
+5

".getMillis()を呼び出すと、結果は常にUTCになります。「私はそれを置くのがあまり好きではありません。 getMillisは、瞬時からUnixエポックの瞬間までの経過時間(ミリ秒)を返します。タイムゾーンは含まれません。 – leonbloy

+4

@leonbloy - 実際、Joda Timeはうるう秒をサポートしていないので、実際には正確なミリ秒数ではありません。これは、UTCでの瞬時の整数表現であり、うるう秒ではありませんでした。ちょうど技術的に正確です。すべての目的と目的のために、どちらの方法でもそれらを考えることができます。 –

関連する問題