Java7までは日付や時刻を扱うときはDateクラスやCalendarクラスを用いていましたが、Java8からは新しい日時関連のクラスがjava.timeパッケージとして追加されました。
勉強がてら、Java8で追加された日時APIの特徴と使い方をメモとして残しておきます。
Java8で追加された日時APIの特徴
- スレッドセーフである
- 曖昧な日時を表現できる
- 「ナノ秒」単位で時間を扱える
DateクラスやCalendarクラスと違って、Java8で追加された日時APIはスレッドセーフなので、マルチスレッド環境でも安全に日付や時刻を扱えます。
「年・月・日・時・分・秒・ナノ秒・タイムゾーン」のうち、いくつかを保持せず曖昧な日時を表現できるのも特徴の1つです。例えば、LocalDateTimeクラスを使うと「年・月・日・時・分・秒・ナノ秒」を表現できたり、Yearクラスを使うと「年」だけを表現できたりします。いい意味で曖昧さを表現できるんですね。
Java7までは最小でも「ミリ秒」単位でしか時間を扱えませんでしたが、Java8からはさらに小さい単位「ナノ秒」まで扱えます。
Java8で追加された代表的な日時クラス
- Instant
日時(エポック時間) - ZonedDateTime
日時(タイムゾーンあり)。世界のある「瞬間」の時刻をナノ秒単位で厳密に保持する - LocalDateTime
日時(タイムゾーンなし)。日常的に使われる「曖昧な日時」を保持する - Duration
2つの異なる時刻や日付の期間を保持する(「時・分・秒」単位) - Period
2つの異なる時刻や日付の期間を保持する(「年・月・日」単位)
ここからは、上記クラスの使い方を簡単にまとめます。
Instantクラスの使用例
ZonedDateTimeクラスの使用例
LocalDateTimeクラスの使用例
Durationクラスの使用例
Periodクラスの使用例
まとめ
Java8で追加された日時APIの特徴と使い方をまとめました。
以下書籍の内容がとても参考になりました。Java学習にもってこいの1冊です。