web-dev-qa-db-ja.com

Java 8でZoneIdをZoneOffsetに変換する方法はありますか?

Method1によってEpoch秒とzoneIdがあります。システムのデフォルトzoneIdでLocalDateTimeに変換できますが、ZoneOffset.systemDefaultがないため、method2によってEpoch秒をLocalDateTimeに変換する方法が見つかりません。あいまいだと思います。

import Java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}

val epochSecond = System.currentTimeMillis() / 1000

LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())//method1
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)//method2
60
Renkai

ZoneOffsetからZoneIdを取得する方法は次のとおりです。

Instant instant = Instant.now(); //can be LocalDateTime
ZoneId systemZone = ZoneId.systemDefault(); // my timezone
ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);

注意:ZoneIdは、特定の場所の時間と履歴に応じて異なるオフセットを持つことができます。したがって、異なるインスタントを選択すると、オフセットが異なります。

78

1対1のマッピングはありません。 ZoneIdは、異なるZoneOffsetsのセットが長期にわたって使用される地理的範囲を定義します。タイムゾーンが夏時間を使用する場合、そのZoneOffsetは夏と冬で異なります。

さらに、夏時間の規則は時間の経過とともに変更される可能性があるため、ZoneOffsetは、たとえば1980年13月10日と比較した2015年10月13日。

そのため、特定のインスタントのZoneIdのZoneOffsetのみを見つけることができます。

https://en.wikipedia.org/wiki/Tz_database も参照してください

37
Geert Pante

documentation にあるように、「これは主に一般的なアプリケーションの使用ではなく、低レベルの変換を目的としています」。

Instantを経由することは私にとって完全に理にかなっています-エポック秒は事実上Instantの異なる表現なので、Instantに変換してから特定のタイムゾーンに変換します。

8
Jon Skeet

以下のソリューションの最初の2行が役立つことを願っています。私の問題は、LocalDateTimeとタイムゾーンの名前があり、Java.util.Dateを構築できるようにinstantが必要だったということでした。私のコードはScalaですが、Javaに非常に近いので、理解するのに問題はないはずです。

val zid = ZoneId.of(tzName)                                // "America/Los_Angeles"
val zo: ZoneOffset = zid.getRules.getOffset(localDateTime) // ⇒ -07:00
                                         // 2017-03-16T18:03

val odt = OffsetDateTime.of(localDateTime, zo) // ⇒ 2017-03-16T18:03:00-07:00
val instant = odt.toInstant                    // ⇒ 2017-03-17T01:03:00Z
val issued = Date.from(instant)
7
gknauth

次は、このタイムゾーンの標準時間を取得するためにUTCに追加する時間をミリ秒単位で返します。

TimeZone.getTimeZone(ZoneId.of("Europe/Amsterdam")).getRawOffset()
0
Jelmer