Date And Time APIの日時クラス

Date And Time APIの日時クラスをまとめる。

Date And Time APIの日時クラスのまとめ。クラス数も増えたがDate・Calendarに比べ表現豊かになった。

日時クラスにおける接頭辞

Date And Time APIにおける日時クラスは、接頭辞によって時差のサポートする範囲を判断できる。

Table 1. 接頭辞
接頭辞 概要

LocalXXX

時差をサポートしない

OffsetXXX

UTCからの時差のみをサポート

ZonedXXX

タイムゾーンをサポートする

日時クラス

DateTimeクラス図

Table 2. 日時クラス
クラス 概要

LocalDateTime

時差をサポートしない日時クラス

OffsetDateTime

時差のみをサポートする日時クラス

ZonedDateTime

タイムゾーンをサポートする日時クラス

日時を表すクラスは3種類あり、時差のサポートする範囲がそれぞれ違う。

LocalDateTimeは、ISO8601における時差のない歴日付及び地方時に対応する。JavaDocにもあるが(時差表示のない)壁がけ時計のイメージ。日時は表現されているが、どの時差かはわからない。見る人が暗黙的に判断する。時差をサポートしないので時差情報を持たない。

OffsetDateTimeは、ISO8601における時差を持つ歴日付及び地方時に対応する。LocalDateTimeにZoneOffsetを加えた形。ZoneOffsetは時差。

ZonedDateTimeは、ISO8601にはなくDate And Time API独自のモノでタイムゾーンに対応する日時クラス。ZoneOffsetに加え、ZoneIdも保持する。クラスとしてはZoneIdになっているが実質はZoneRegionの実装クラスで、これがタイムゾーンにおける夏時間などの情報を持っている。

時差クラス

時差クラス図

Table 3. 時差クラス
クラス 概要

ZoneId

時差及びタイムゾーンを表現するクラス。ファクトリも提供。

ZoneOffset

時差を表現するクラス。

ZoneRegion

タイムゾーンを表現するクラス。(パッケージプライベート)

ZoneIdが時差及びタイムゾーンを表現するクラスになるが、abstractなのでZoneOffsetかZoneRegionが具体クラスになる。ただし、ZoneIdがファクトリメソッドを提供するので、そこまで意識する必要は無い。特にZoneRegionはパッケージプライベートなので直接扱うことすらできない。

ZoneIdのof()メソッドに「地域名/地名」「時差」などを渡すことでZoneIdは生成可能。システムのデフォルトを取得したい場合はsystemDefault()メソッドを利用する。

ZoneIdの生成
ZoneId asiaTokyoZoneId = ZoneId.of("Asia/Tokyo");
ZoneId utcZoneId = ZoneId.of("UTC");
ZoneId offsetZoneId = ZoneId.of("+09:00");
ZoneId defaultZoneId = ZoneId.systemDefault();

日付と時刻クラス

日付と時刻クラス図

Table 4. 日付と時刻クラス
クラス 概要 フォーマット

LocalDate

時差をサポートしない日付クラス。

YYYY-MM-DD

LocalTime

時差をサポートしない時刻クラス。ナノ秒まで対応。

hh:mm:ss.s

OffsetTime

UTCからの時差付き時刻クラス。ナノ秒まで対応。

hh:mm:ss.sZ
hh:mm:ss.s±hh:mm

日付と時刻を表すためのクラス。いままでのDateとは違い、日時クラスから分離して「日付」「時刻」だけで表現可能になった。

年月日クラス

年月日クラス図

Table 5. 日付と時刻クラス
クラス 概要 フォーマット

Year

年を表すクラス。

YYYY

YearMonth

年月を表すクラス。

YYYY-MM

MonthDay

月日を表すクラス。

--MM-DD

Month

月を表す列挙型。

DayOfWeek

曜日を表す列挙型。

年月日など表すためのクラス。「Year」「YearMonth」「MonthDay」はISO8601の下位省略や上位省略に対応する。「Month」「DayOfWeek」は「月」「曜日」を表す列挙型で、ISO8601の「歴月」「歴日」に対応する。