2016-04-14 6 views
1

私は一時的なユーティリティの基本的なメカニズムを理解しようとしています。javaのデータ、オフセット、およびタイムゾーン

だから、私は次の例を作った:

public class Test { 
    public static void main(String[] args) { 

     System.out.println(Instant.now().getEpochSecond()); 
     System.out.println(new Date().getTime()); 
     System.out.println(LocalDateTime.now().atZone(ZoneId.systemDefault()).toEpochSecond()); 
     System.out.println(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)); 

     System.out.println(ZoneId.systemDefault().toString()); 
    } 
} 

出力は次のとおりです。

1460651620 
1460651620182 
1460651620 
1460662420 
Europe/Helsinki 

私の現在のsystemDefaultするzoneidは、ヨーロッパ/ヘルシンキ(3時間)である
我々はnew Date()を作成すると、それは持っていますunixタイムスタンプ(UTC)。

これは印刷結果を比較する際の基準点です。

私の3番目のSystem.out私は確立されたタイムゾーンsystemDefaultでLocalDateTimeを持っていますが、実際には出力は同じです。私はより大きな価値(+3時間)を期待していました。

2.第4の出力ラインでは、混乱する結果が出ますが。私は同じ値を期待しましたnew Date().getTime()

出力を理解するのに助けが必要です。

答えて

2

タイプgetEpochSecond()の任意の方法とtoEpochSecond()は時間が結果はタイムゾーンが選ばれたものは何でも同じであるので、どんな時間帯と同じ方法を実行している、1970-01-01T00:00:00Zのエポックからのあなたの秒の量を与えます。

あなたのタイムゾーンでこの質問を書くのに10分を費やしたとすると、自分のタイムゾーンでは同じ10分になります。

2

私は、あなたがいない確立タイムゾーンsystemDefault

でのLocalDateTimeを持っています。あなたはLocalDateTimeで始まっていましたが、ZonedDateTimeに変換しました。 ZonedDateTimeは実質的にで、ZoneIdであり、あいまいさを処理するUTCからのオフセットです。

LocalDateTimeは固定時間を表していないので、toEpochSecond()メソッドはありません。 toEpochSecond(ZoneOffset)があります。これは、UTCオフセットを適用してローカルの日付/時刻を固定した時点に「アンカー」するためです。

は比較、それがタイムゾーンの追加のコンテキストと、時間内の固定点を表すためは、パラメータなしtoEpochSecond()方法を有するZonedDateTime有します。 (あなたはZoneIdZoneOffsetZoneId、またはLocalDateTimeInstantとしてZonedDateTimeを表示することができますいずれか、彼らは同等だが、個人的に、私は後者の概念を好む。)

注意をあなたのコード与えることができることあなたは別の結果を得ました.-時計が戻ってくるためにLocalDateTime.now()があいまいだった場合(通常は夏時間の終わりに)その場合、LocalDateTime.atZoneはそれ以前の出現を選択しますが、現実にはの出現が発生する可能性があります。これはLocalDateTime.now().atZone(zone)ZonedDateTime.now(zone)の違いです。後者は、オフセットを常に正確に「知っています」。

関連する問題