0

Java の ZonedDateTime ライブラリを使用して、標準タイムゾーン リスト (Olson タイムゾーン データベース) から任意のタイムゾーンの 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);
    }
}

そして、これらの出力は、

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

ご覧のとおり、カラカスの UTC オフセットは正しいですが、イスタンブールのオフセットは実際には +3 ですが、出力は +2 となりますが、これは正しくありません。この Java ライブラリの動作方法に変更はありますか? または、olson Id を UTC オフセットに変換するためのより信頼性の高いライブラリがありますか?

注: olson ID リスト

4

2 に答える 2

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
于 2017-01-11T22:36:57.607 に答える
1

トルコは最近 DST の監視を停止しました。タイムゾーン データベースはおそらく最新ではありません。

改訂履歴を見ると、バージョン tzdata2016g で変更が導入されています。執筆時点で、JDK の最新バージョンは 111/112 の更新であり、これは tzdata2016f を使用するため、トルコの正しいタイム ゾーンがありません。

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

于 2017-01-12T09:43:36.860 に答える