2015-11-01 43 views
5

標記之前重複仔細閱讀Plus Plus不能使用Joda Time和Java 8 time.util *如何在沒有喬達時間的情況下在Java 7中正確處理夏令時?

我試圖讓DST啓用的國家的當前日期。因爲有時區,所以我得到[local-millis] = [UTC-millis] + [offset-millis],所以我加了DST_OFFSET以在DST啓用的國家得到時間,就像在Linux機器GMT_TIME + LOCAL_TIME_ZONE_OFFSET + DST_OFFSET上得到的那樣,以獲得當前的本地時間。

打印當前時間的代碼Istanbul當前DST已啓用1小時。

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()); 

    } 
} 

這給了我正確的輸出

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

但由於上面的代碼是沒有這麼多的通用的,所以我試圖添加以下行,因此,如果僅白天被啓用,則只會增加 的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,但顯示結果1小時現在領先

Ideone鏈接的方式訂購的所有代碼討論1. https://ideone.com/4NR5Ym 2. https://ideone.com/xH7vhp 3. https://ideone.com/tQenb5

我的問題是什麼是timeZone.inDaylightTime(new Date())伊斯坦布爾添問題e區。爲什麼它顯示錯誤。爲什麼對巴西來說,即使inDaylightTime爲真,我也沒有獲得當前的DST時間。 處理這種情況的正確方法是什麼?

回答

3

今天土耳其似乎有幾個關於時區和日光節約的問題。

這可能是因爲Turkey has changed the date for the daylight savings switch from November 1 to November 8.

在JVM的時區數據可能與變化的電流。 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

確定了..但是對於巴西沒有這個calendar.add我得到正確的輸出意味着不需要添加dst你能建議爲什麼嗎? –

+0

無法在Windows中完成!即使使用'GitBash',我也有例外:引起來自:java.io.EOFException at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:268) ' – FaithReaper

3

你不應該這樣做:

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

你也不應該這樣做:

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

您不需要手動調整時間。它會根據您的格式化日期自動完成。撥打add只是移動您正在使用的瞬間時間點。

刪除這些行,並更新您的JVM以接受最新的土耳其DST更改(如Monz在他的回答中所述),並且您應該很樂意去。

+0

對,直接操作日曆值來調整日光儲蓄是不正確的。更改日曆對象的時間值實際上正在改變事件發生的時間(或日曆值意味着代表的任何時間)。時間*區域*更改調整時間的*顯示*值(這就是爲什麼完全格式化的時間字符串始終包含時間)下面是我剛纔寫到的一篇文章:http://monztech.com/index.php/2015/11/01/daylight-savings-for-developers/ – Monz

相關問題