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
ZoneOffset
からZoneId
を取得する方法は次のとおりです。
Instant instant = Instant.now(); //can be LocalDateTime
ZoneId systemZone = ZoneId.systemDefault(); // my timezone
ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);
注意:ZoneId
は、特定の場所の時間と履歴に応じて異なるオフセットを持つことができます。したがって、異なるインスタントを選択すると、オフセットが異なります。
1対1のマッピングはありません。 ZoneIdは、異なるZoneOffsetsのセットが長期にわたって使用される地理的範囲を定義します。タイムゾーンが夏時間を使用する場合、そのZoneOffsetは夏と冬で異なります。
さらに、夏時間の規則は時間の経過とともに変更される可能性があるため、ZoneOffsetは、たとえば1980年13月10日と比較した2015年10月13日。
そのため、特定のインスタントのZoneIdのZoneOffsetのみを見つけることができます。
documentation にあるように、「これは主に一般的なアプリケーションの使用ではなく、低レベルの変換を目的としています」。
Instant
を経由することは私にとって完全に理にかなっています-エポック秒は事実上Instant
の異なる表現なので、Instant
に変換してから特定のタイムゾーンに変換します。
以下のソリューションの最初の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)
次は、このタイムゾーンの標準時間を取得するためにUTCに追加する時間をミリ秒単位で返します。
TimeZone.getTimeZone(ZoneId.of("Europe/Amsterdam")).getRawOffset()