12

時間操作には JodaTime ライブラリを使用します。日付が 2 つあります: 日付 1:

DateTime time_server = new DateTime(server_time_milisecs).
    withZone(DateTimeZone.forID("Europe/Zurich"));  //+0100

ショー:2013-01-27 13:44:42

日付 2:

DateTime time_local = new DateTime(DateTime.now()).
    withZone(DateTimeZone.getDefault());    //Have "Europe/Moscow" timezone  +0400

ショー:2013-01-27 16:41:47

タイムゾーンを含む実際の間隔を見つける必要があります

Interval interval = new Interval(time_local, time_server);
Long.toString(interval.toDurationMillis()));

結果: 174040 ミリ秒 -正しくない

int secs = Seconds.secondsBetween(time_local,time_server).getSeconds();

結果: 174 秒正しくありません

Period period = new Period(time_local, time_server);
Integer.toString(period.getSeconds()) //**Wrong too**

結果は次のようになります: 10974 秒

4

1 に答える 1

31

異なるタイムゾーンを含む時間計算を行う必要がある場合は、Jodatime の概念 ( など) を理解するために少し時間を費やす必要があります (しゃれは意図されていません)。

たとえば、次のコードを考えてみましょう

DateTime nowHere = DateTime.now();
DateTime nowZur = nowHere.withZone(DateTimeZone.forID("Europe/Zurich"));
System.out.println("now Here:   " + nowHere );
System.out.println("now Zurich: " + nowZur  );

これは出力します(私にとっては、チューリッヒからの4時間のオフセット):

now Here:   2013-01-27T10:19:24.460-03:00
now Zurich: 2013-01-27T14:19:24.460+01:00

一時停止して、次の行の出力を推測してみてください。

Interval interv = new Interval(nowHere, nowZur);
System.out.println("Interval: " + interv.toDurationMillis());

上記の出力0(ゼロ)。当然のことです。

nowHereとは、2 つの異なる国で表されるように、(物理的な線時間で)同じ瞬間をnowZur表しているためです。それらは表現方法のみが異なりますが、物理的には同じ時点です (とは同じ長さで、2 つの異なる形式で表現されます)。2.54 cm1 in

同様に、2013-01-27T10:19:24.460-03:002013-01-27T14:19:24.460+01:00は同じ瞬間、私がそのコードを実行した瞬間であり、異なる国の慣習に従ってのみ表現されています。火星人は自分の火星暦で同じ瞬間を表すことができますが、それでも同じ瞬間です.

これらの DateTime は同じ時点を表すため、それらの間の物理的な間隔 (期間) はゼロでなければなりません。さて、2 つの間の「市民時差」を取得したい場合、それはまったく別のことです。LocalDateTimeと (と とはまったく異なるPeriod)は正しい概念です。例えば:DateTimeDuration

Period per=new Period(nowHere.toLocalDateTime(),nowZur.toLocalDateTime());
System.out.println(per.toStandardSeconds().getSeconds());

これは私のために14400を出力します(4「標準」-物理的ではありません-時間)

于 2013-01-27T13:34:07.920 に答える