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は対応する」という状態。よって時差だけに対応した日時クラスと、タイムゾーンに対応した日時クラスを分けている。
説明 | クラス |
---|---|
時差だけに対応した日時クラス |
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が省略記法に完全に対応していないことを考慮に入れると、むやみに省略形にこだわる必要は無く、拡張形式を使う方が見た目もわかりやすいのでいい。
形式 | フォーマット | 例 | ||
---|---|---|---|---|
暦日付 |
拡張形式 |
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のデフォルト |
形式 | フォーマット | 例 | ||
---|---|---|---|---|
地方時 |
拡張形式 |
hh:mm:ss |
12:34:56 |
LocalTimeのデフォルト |
地方時及び小数点付き |
拡張形式 |
hh:mm:ss.s |
12:34:56.789 |
LocalTimeのデフォルト |
地方時 |
拡張形式 |
hh:mm |
12:34 |
LocalTimeのデフォルト |
形式 | フォーマット | 例 | ||
---|---|---|---|---|
地方時+UTC |
拡張形式 |
hh:mm:ss.sZ |
12:34:56Z |
OffsetTimeのデフォルト |
地方時+時差 |
拡張形式 |
hh:mm:ss.s±hh:mm |
12:34:56+09:00 |
OffsetTimeのデフォルト |
形式 | フォーマット | 例 | ||
---|---|---|---|---|
暦日付及び地方時 |
拡張形式 |
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 A: 参考
Appendix B: 改訂履歴
-
v1.0, 2016-07-06: 初稿