Date And Time APIとISO8601

ISO8601を簡単に学びつつ、Date And Time APIの対応をまとめる。

執筆時バージョン
Java

Java SE 8

Date And Time APIはISO8601をモデリングしたようなAPIではあるが、全てに対応しているわけではない。この記事ではISO8601を簡単に学びつつ、Date And Time APIの対応をまとめる。

ISO8601の仕様はこちらを参照。

基本

ISO8601は、協定世界時(UTC)とグレゴリオ暦を基準とする。

協定世界時(UTC)

グリニッジ標準時(GMT)のイメージもあるが、日常で使われているのはこの協定世界時(UTC)の方。ISO8601も、もちろん協定世界時(UTC)。

時差(Offset)

ISO8601は時差(Offset)を扱う。UTCが基準。日本はUTCから9時間進んでいるので、「+09:00」のような表記をする。

ISO8601は、この時差しか扱わない。いわゆる夏時間のようなものは対応していない。この夏時間に対応するにはタイムゾーンを扱うことになるがISO8601には含まれていない。

それでは困ってしまうアプリケーションがあるので、「ISO8601はタイムゾーンに対応しないが、Date And Time APIは対応する」という状態。よって時差だけに対応した日時クラスと、タイムゾーンに対応した日時クラスを分けている。

Table 1. 日時クラスの対応
説明 クラス

時差だけに対応した日時クラス

OffsetDateTime

タイムゾーンに対応した日時クラス

ZonedDateTime

グレゴリオ暦

ISO8601はグレゴリオ暦。ただしグレゴリオ暦が広く導入される1582年以前もグレゴリオ暦で扱ってしまうので要注意。旧暦がからんでくる日時は食い違う可能性が出てくる。

日時表記

上記の基本をふまえて、日時に関する表記が定義される。この形式で(JSONなど)やりとりを行えば、デフォルトのフォーマッタでパースやフォーマットもできるので形式に悩むこともなくなる。

ISO8601における日時表記には次の原則がある。

  • 桁数が重要で、省略することができない。

つまり「2016-2-16」というのはダメで、「2016-02-16」のようにゼロを省略してはいけないということ。一方区切り文字については、むしろ省略したものを基本形式としているので、省略可能な場合が多い。ただしDate And Time APIがデフォルトで全てのISO8601に対応しているわけではない。(DateTimeFormatterを定義すれば対応は不可能ではない)

また、ISO8601には下位省略や上位省略などの省略されたものも多く定義されているが、同様にDate And Time APIが全てに対応しているわけではない。

Date And Time APIが省略記法に完全に対応していないことを考慮に入れると、むやみに省略形にこだわる必要は無く、拡張形式を使う方が見た目もわかりやすいのでいい。

Table 2. 日付表記
形式 フォーマット

暦日付

拡張形式

YYYY-MM-DD

2016-02-16

LocalDateTimeのデフォルト

基本形式

YYYYMMDD

20160216

DateTimeFormatter.BASIC_ISO_DATE

暦日付
(上位省略)

拡張形式

--MM-DD

--02-16

MonthDayのデフォルト

暦日付
(下位省略)

基本形式

YYYY-MM

2016-02

YearMonthのデフォルト

暦日付
(下位省略)

基本形式

YYYY

2016

Yearのデフォルト

Table 3. 時刻表記(地方時)
形式 フォーマット

地方時

拡張形式

hh:mm:ss

12:34:56

LocalTimeのデフォルト

地方時及び小数点付き

拡張形式

hh:mm:ss.s

12:34:56.789

LocalTimeのデフォルト

地方時
(下位省略)

拡張形式

hh:mm

12:34

LocalTimeのデフォルト

Table 4. 時刻表記(UTC・時差)
形式 フォーマット

地方時+UTC

拡張形式

hh:mm:ss.sZ

12:34:56Z

OffsetTimeのデフォルト

地方時+時差

拡張形式

hh:mm:ss.s±hh:mm

12:34:56+09:00

OffsetTimeのデフォルト

Table 5. 日時表記
形式 フォーマット

暦日付及び地方時

拡張形式

YYYY-MM-DDThh:mm:ss.s

2016-02-16T12:34:56.789

LocalDateTimeのデフォルト

暦日付及び地方時及びUTC

拡張形式

YYYY-MM-DDThh:mm:ss.sZ

2016-02-16T12:34:56.789Z

OffsetDateTimeのデフォルト

暦日付及び地方時及び時差

拡張形式

YYYY-MM-DDThh:mm:ss.s±hh:mm

2016-02-16T12:34:56+09:00

OffsetDateTimeのデフォルト

Appendix B: 改訂履歴

  • v1.0, 2016-07-06: 初稿