2017-02-20 8 views
1

Java DSTの変更に関する問題を発見しました。 DST(夏時間)が発生した正確な瞬間に、特定の時刻が2回表示されることがあります。Java DST変更の問題

たとえば、タイムゾーンAmerica/Sao_Pauloの場合、2016年2月21日日曜日、00:00:00から2016年2月20日23:00:00土曜日の1時間後に変更されました。 時刻23:00はその日に2回表示されます。

私の使用例では、2回目にしたいと思います。たとえば、この日のデータが必要な場合は、実際にこの日を完全に意味します(おそらく、25時間が含まれていても)。

私の意見では、Javaがこの瞬間にはじめてのようです。

例:この例では

@Test 
public void testDSTChange() throws ParseException { 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 

    TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo"); 

    long dateInput = sdf.parse("2016-02-20T23:00:00").getTime(); 
    long dateUTC = dateInput - tz.getOffset(dateInput); 

    long dateInput2 = sdf.parse("2016-02-21T02:00:00").getTime(); 
    long dateUTC2 = dateInput2 - tz.getOffset(dateInput2); 

    System.out.println("Difference: " + (dateUTC2 - dateUTC)/3600/1000); 

} 

、これら2つの日付の間の差が4時間ではなく、私が期待3時間であることを示しています。だから私はそれを行うための他の方法があるのだろうか?

+0

私はあなたの質問を明確に理解していません。あなたはその特定の日のあなたの時間が時間の変化によって影響を受けないことを望んでいますか? – JFPicard

+0

いいえ、DST変更後の時間が必要です。私の例では、2016-02-20T23:00:00が実際にその日に2回起こり、DSTの変更後の2番目のものを取りたいと思います。 –

+1

'java.util.Date'と' java.util.Calendar'ではなくJoda TimeまたはJava 8を使用できますか? –

答えて

0

まあ、夏時間の変更時の時刻は、夏時間が逆方向に変更されたときに2回発生します。周りには道がありません。別の方法があるかもしれませんが、私は内部的にDSTを持たないUTC時間(GMT)を内部的に使用し、表示目的で出力時に現地時間(ウォールクロック時間)に変換する提案をします。もう一度心配する必要はありません。

+2

「すべてのものにUTCを使用する」アドバイスが頻繁に出されますが、一般化されすぎています。*いくつかのものは大丈夫ですが、他のものはありません。たとえば、現地時間の午後3時に開始する週間会議を希望する場合は、実際には "実際に* UTCに変換された3pmローカル"として保存する必要はありません。そうではありません。確かにそのアプローチを取ることは、「あなたはそれをもう一度心配する必要はありません」という意味ではありません。 –

0

私の使用例では、もう一度やりたいと思います。たとえば、この日のデータが必要な場合は、実際にこの日を完全に意味します(おそらく、25時間が含まれていても)。

このステートメントから、実際には、一日中データを収集するためにある種の範囲クエリを実行していると仮定します。これに最も近い方法は、を含むの開始日から次の日の冒頭に照会することです。です。言い換えれば:startOfDay <= dataPoint(s) < startOfNextDay

次の日が開始されるまでクロックが実際に00:00に当たらないので、これは、あなたのシナリオに適しています。これは次のようになります:

23:58 
23:59 
23:00 
23:01 
... 
23:58 
23:59 
00:00 <--- start of next day 

半開きの間隔を使用してください。ちょうどうまくいくはずです。

春の移行には注意が必要ですが、今日の開始日が01:00で、00:00でない場合は注意してください。 :)

また、Java 8の新しい時刻API、またはJoda-Timeの使用についてのコメントは注目されています。両方とも、この状況をより良くコントロールできます。古いJava APIはそうではありません。

関連する問題