2015-11-01 6 views
5

マーキングする前にそれを完全に読んでください。Plus Joda TimeとJava 8 time.util *は使用できません。Joda Timeを使用しないでJava 7で夏時間を正しく処理する方法は?

DSTが有効になっている国の現在の日付を取得しようとしています。タイムゾーンでは[local-millis] = [UTC-millis] + [offset-millis]になるので、のように現在のローカル時刻を取得するために、DST_OFFSETを追加してDST対応国で時刻を取得してください。

現在のDST有効時間が1時間であるIstanbulの現在の時刻を出力するコード。

上記のコードは唯一の昼間は、その後、有効になっている場合にのみ追加するように私は、行以下を追加しようとした一般的なのはあまりないので、私に正しい出力

Current date and time : 2015-11-01 20:49:54 
The Hour of the Day is : 20 
The TimeZone is : Europe/Istanbul 

を与えた。しかし

public class DstInstanbul { 

    public static void main(String...args){ 

     Calendar calendar = Calendar.getInstance(); 

     TimeZone timeZone = TimeZone.getTimeZone("Europe/Istanbul"); 

     calendar.setTimeZone(timeZone); 

     calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings()); 


     SimpleDateFormat simpleDateFormatLocal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     simpleDateFormatLocal.setTimeZone(TimeZone.getTimeZone("Europe/Istanbul")); 

     System.out.println("Current date and time : " + simpleDateFormatLocal.format(calendar.getTime())); 


     System.out.println("Current date and time : " + simpleDateFormatLocal.format(calendar.getTime())); 
     System.out.println("The TimeZone is : " + calendar.getTimeZone().getID()); 

    } 
} 

dstSavingだから私は

if (timeZone.inDaylightTime(new Date())){ 
      calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings()); 
     } 

と、次のcalendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());を変更しかし、問題は、私はそうするならば、私は任意のDSTせずに出力を得ることです。そして、System.out.println(timeZone.inDaylightTime(new Date()));を印刷する偽の私に与え、あなたがこのリンクでIstanbul clock

Current date and time : 2015-11-01 19:54:49 
The TimeZone is : Europe/Istanbul. 

を見ることができるようので、その結果が、夏時間があるタイムゾーンBrazilのための同じ論理がinDaylightTimeのために私に本当を与えるが、結果一時間を表示します先に今

方法で注文したすべてのコードのためのIdeoneリンクは、私の質問は、イスタンブールのティムとtimeZone.inDaylightTime(new Date())に問題があるものである1 https://ideone.com/4NR5Ym 2. https://ideone.com/xH7vhp 3. https://ideone.com/tQenb5

を議論しましたeゾーン。なぜそれが間違っているのか。ブラジルのためになぜinDaylightTimeが本当であっても私は現在のDST時間を得ていません。 このような状況を処理する適切な方法は何ですか?

答えて

3

トルコでは、今日のタイムゾーンと夏時間に関するいくつかの質問があるようです。あなたのJVMでTurkey has changed the date for the daylight savings switch from November 1 to November 8.

タイムゾーンデータが変更と現在ではないかもしれないので、

これは可能性があります。 Oracle has an update for their JVM.

上記のリンクからダウンロードしたタイムゾーンデータアップデータは、実行可能なjarファイルです。UNIXホスト上のJVM更新するには:

sudo java -jar tzupdater.jar --update --location http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz 

をツールはとても実行を確認するために、アップデートの出力は何もしていないようです:

java -jar tzupdater.jar --version 

トルコの更新とタイムゾーンデータのバージョンtzdata2015g

+0

でも、ブラジルのカレンダーはありません。私は正しい出力を得ています.dstを追加する必要はありません。理由は何ですか? –

+0

Windowsでは実行できません!私は 'GitBash'でも例外があります:'原因:java.io.EOFException java.util.zip.GZIPInputStream.readByte(GZIPInputStream.java:268) ' – FaithReaper

3

あなたがこれを行うべきではありませんされています

calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings()); 

をも、あなたはこれを行う必要があります:

if (timeZone.inDaylightTime(new Date())){ 
    calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings()); 
} 

時間を手動で調整する必要はありません。これは、フォーマットしている日付に基づいて自動的に行われます。 addを呼び出すと、あなたが作業している瞬時のポイントだけが移動します。

これらの行を削除し、最新のトルコ語DST変更(彼の答えに記載されているMonz)を利用するようにJVMを更新してください。

+0

右、カレンダーの値を直接操作して昼光に合わせる節約は正しくありません。 Calendarオブジェクトの時間値を変更すると、実際にイベントが発生した時刻(またはそのCalendar値が表すもの)が変更されます。Time * zone *の変更は時刻の*表示*値を調整します(そのため、オフセット)。これはちょうど今日これについて書いた投稿です:http://monztech.com/index.php/2015/11/01/daylight-savings-for-developers/ – Monz

関連する問題