2017-11-30 11 views
0

私は次の日付オブジェクトWed Nov 01 00:00:00 GMT 2017を持っています。これは明らかにGMTにありますが、別のタイムゾーンにあると考えています。JavaのDateオブジェクトにZoneIdを適用します。

例として、上記の日付を次のタイムゾーンUS/Mountainに入れて、それをUTCに変換したい場合は、Wed Nov 01 07:00:00 UTCという結果になります。

私は時間を保存しながら日付のタイムゾーンを変更する方法を見つけようとしましたが失敗しました。

おかげ

JavaタイムAPIで
+0

java.util.Dateまたはjava.time.LocalDateを使用していますか? – Al1

+0

私はjava.util.Date –

+1

@AdrianDanielCuleaを使用しています。申し訳ありませんが、私は抵抗できませんでした。真剣にも、現代のJavaの日時APIはとても使い勝手が良いので、変更することをお勧めします。 –

答えて

1

java.util.Dateインスタンスがあることをご理解いただきありがとうございます。たとえば、Wed Nov 01 00:00:00 GMT 2017として印刷されます。これは、そのtoStringメソッドが生成するものです。 Dateにタイムゾーンはありません。通常Date.toString()はJVMのタイムゾーン設定を取得し、このタイムゾーンで日付をレンダリングします。だからあなたはGMTタイムゾーンを実行しているようですか? this popular blog entry: All about java.util.Dateで詳しく読むことができます。

可能であれば、Dateを避けてください。 The modern Java date and time API known as java.time or JSR-310は、あなたのようなタイムゾーンの魔法のために、一般的にも、少なくとも、両方とも、とてもうまく動作します。次に、assylias’ answerを使用します。

この回答では、以前のAPIからDateを取得したとします。変更できない(または今すぐ変更できない)可能性があります。私はあなたが望む変更のために最新のAPIをお勧めします。次のスニペットからの出力で、コード内にコメントとして示します。

System.out.println(oldFashionedDateObject); // Wed Nov 01 00:00:00 GMT 2017 
    // first thing, convert the Date to an instance of a modern class, Instant 
    Instant pointInTime = oldFashionedDateObject.toInstant(); 
    // convert to same hour and minute in US/Mountain and then back into UTC 
    ZonedDateTime convertedDateTime = pointInTime.atOffset(ZoneOffset.UTC) 
      .atZoneSimilarLocal(ZoneId.of("US/Mountain")) 
      .withZoneSameInstant(ZoneOffset.UTC); 
    System.out.println(convertedDateTime); // 2017-11-01T06:00Z 

    // only assuming you absolutely and indispensably need an old-fashioned Date object back 
    oldFashionedDateObject = Date.from(convertedDateTime.toInstant()); 
    System.out.println(oldFashionedDateObject); // Wed Nov 01 06:00:00 GMT 2017 

私はWed Nov 01 06:00:00を得ました。 Current Local Time in Denver, Colorado, USAによると、夏時間(DST)は今年11月5日に終了しました。

1

は、次のことができます。

  1. は結果によう

何かを変換するZonedDateTime

  • 使用zonedDateTime.withZoneSameLocalzonedDateTime.withZoneSameInstantとして文字列を解析しますこれは:

    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z uuuu"); 
    
    ZonedDateTime gmt = ZonedDateTime.parse("Wed Nov 01 00:00:00 GMT 2017", fmt); 
    ZonedDateTime mountain = gmt.withZoneSameLocal(ZoneId.of("US/Mountain")); 
    ZonedDateTime utc = mountain.withZoneSameInstant(ZoneOffset.UTC); 
    
    System.out.println(utc.format(fmt)); 
    

    出力はWed Nov 01 06:00:00 Z 2017です(DSTは11月3日のみ有効です)。

  • 関連する問題