2017-01-11 16 views
0

JavaのZonedDateTimeライブラリを使用して、標準タイムゾーンリスト(Olsonタイムゾーンデータベース)からタイムゾーンのUTCオフセットを取得しています。ZonedDateTimeが正しくないUTCオフセット値を返します

ここに私の簡単なコードです。

For Europe/Istanbul, UTC2.0 
For America/Caracas, UTC-4.5 

我々はUTCは、カラカスのオフセットを見たよう

import java.time.ZoneId; 
import java.time.ZonedDateTime; 

public class HelloWorld{ 

    public static void main(String []args){ 
     displayUtcOffset("Europe/Istanbul"); 
     displayUtcOffset("America/Caracas"); 
    } 

    public static void displayUtcOffset(String olsonId){ 
     ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of(olsonId)); 
     float utcOffset = zonedDateTime.getOffset().getTotalSeconds()/3600f; 
     System.out.println("For "+olsonId+", UTC"+utcOffset); 
    } 
} 

そして、これらの出力があるが、正しいですが、イスタンブールのそれは実際には3ですが、それは間違っている2通りの出力が得られます。 このJavaライブラリの動作方法にいくつか変更がありましたか?または、olson IDをUTCオフセットに変換するためのより信頼性の高いライブラリがありますか?

注:olson Ids List

答えて

1

あなたのアカウントに夏時間を取るましたか?あなたは夏の時間を確認するとき、例えば、次のように:

public static void displayUtcOffset(String olsonId){ 
     ZonedDateTime zonedDateTime = ZonedDateTime.of(2017, 7, 15, 1, 1, 11, 1, ZoneId.of(olsonId)); 
     float utcOffset = zonedDateTime.getOffset().getTotalSeconds()/3600f; 
     System.out.println("For "+olsonId+", UTC"+utcOffset); 
    } 

出力は、あなたが期待したものとコヒーレントである:

For Europe/Istanbul, UTC3.0 
For America/Caracas, UTC-4.5 
+0

これは問題です。イスタンブールに夏時間がない場合でも、この図書館ではまだ検討中です。これを修正する方法はありますか?あるいは別のライブラリに切り替える必要がありますか? –

+0

ああ、私はトルコがDSTを削ったことを知らなかった(彼らにはいい!)。その後、指示は[ここに]与えられている(http://stackoverflow.com/a/40401351/5899161) – lukeg

1

トルコは最近DSTを観察停止し、あなたのタイムゾーンデータベースは、おそらく最高ではありません現在まで。

the revision historyを見ると、バージョンtzdata2016gで変更が導入されました。執筆時点では、JDKの最新バージョンはアップデート111/112 which use tzdata2016fであるため、トルコの正しいタイムゾーンはありません。

おそらく訂正が含まれるJDKの次回の更新を待つか、the Timezone Updater Toolを使用して最新のタイムゾーンデータベースをインストールすることができます。

関連する問題