bugfix> java > 投稿
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Etc/GMT+1"));

デバッグ時に2019-07-02T14:23:57.463-01:00 [Etc/GMT + 1]が表示されるときのこの値

16:23である必要があります。何が欠けていますか..何らかの理由でクロックが2時間遅いのですか?

回答 1 件
  • tl;dr

    単なるオフセットではなくタイムゾーンを使用します。

    ZonedDateTime.now( 
        ZoneId.of( "Europe/Dublin" )
    )
    
    
    詳細

    現代のプロトコルでは、オフセットの時間-分-秒の数は、ベースライン(GMT/UTC)のaheadである正の数と見なされ、behindである負の数と見なされますベースライン。一部の古いプロトコルは逆です。あなたの Etc/GMT+1  逆スタイルのようです。

    最良の解決策は、単なるオフセットではなくタイムゾーンを使用することです。オフセットは、単に数時間分秒です。タイムゾーンはずっと長くなっています。タイムゾーンは、特定の地域の人々が使用するオフセットの過去、現在、および将来の変更の履歴です。

    タイムゾーンの名前は Continent/Region の形式です 。たとえば、 America/MontrealEurope/Paris 、および Pacific/Auckland

    ZoneId z = ZoneId.of( "Europe/Dublin" ) ;
    ZonedDateTime zdt = ZonedDateTime.now( z ) ;
    
    

    ゾーンの名前を角括弧で追加するために賢明に拡張された標準ISO 8601形式の文字列を生成します。

    String output = zdt.toString() ;
    
    

    ビジネスロジック、ロギング、およびデータ変更のほとんどはUTCである必要があります。 UTCに調整するには、 Instant を抽出します  あなたの ZonedDateTime から 。タイムライン上の同じ瞬間、同じポイントですが、実際の時刻は異なります。

    Instant instant = zdt.toInstant() ;
    
    

    標準のISO 8601形式の文字列を生成します。

    String output = instant.toString() ;
    
    
    あなたの例

    これで、特定の状況を調べるために戻ることができます。

    [Etc/GMT+1] で指定された文字列を解析しましょう  ゾーン名として。

    String input = "2019-07-02T14:23:57.463-01:00[Etc/GMT+1]" ;
    ZonedDateTime zdtInput = ZonedDateTime.parse ( input );
    
    

    次にUTCに調整します。

    Instant instant = zdtInput.toInstant ();
    
    

    再度 Europe/Dublin に調整します 。

    ZoneId zDublin = ZoneId.of( "Europe/Dublin");
    ZonedDateTime zdtDublin = zdtInput.withZoneSameInstant ( zDublin );
    
    

    コンソールにダンプします。

    System.out.println ("zdtInput: " + zdtInput );
    System.out.println ("instant: " + instant );
    System.out.println ("zdtDublin: " + zdtDublin );
    
    

    このコードはIdeOne.comでライブで実行されます。

    zdtInput: 2019-07-02T14:23:57.463-01:00[Etc/GMT+1]

    instant: 2019-07-02T15:23:57.463Z

    zdtDublin: 2019-07-02T16:23:57.463+01:00[Europe/Dublin]

    14時間目

    案の定、私たちは [Etc/GMT+1] で曜日を見る  UTC(時間オフセットの古い逆の意味)の時間で、時間は 14 である時間

    時間15

    UTC(0時間-分-秒のオフセット)の時間は 15 です 。

    時間16

    ダブリンのタイムゾーンは、その時点で夏時間(DST)ではなく、アイルランド標準時(IST)、UTC +1を使用しています。そのため、その時間は 16 で表示されます 、UTCの 15 の1時間  時間。

    重要:これら3つすべてが同じ瞬間、つまりタイムライン上のまったく同じポイントを表していることを理解してください。壁時計の時刻は異なります。同じ瞬間を表示する3つの方法です。


    ところで、タイムゾーンの代わりにオフセットを使用する場合は、 OffsetDateTime を使用します  & ZoneOffset  クラス。ザ・ ZonedDateTime  & ZoneId  クラスはタイムゾーン用です。

あなたの答え