Date and Time API を ThreeTen と呼びたいなー

JSR310だからThreeTenって呼ばれてるみたい。会社で「ThreeTenがさー」て言ったらうざがられそうだけど積極的に使っていきたい!

「Date and Time APIラムダ式ハンズオン」な関ジャバの勉強会を7/11(SAT)に楽天大阪で開催しますよ!

kanjava.connpass.com
ということで。 @khasunuma さんのブログを読んで、Java8 の Date and Time API を予習しようー。

前提

僕はjoda-timeが好きです。特にImmutableなところが好き。あとtoStringがISO8601なところも好き。
そしてDate and Time APIはあんまり知らないです。

Javaの日付と時刻周りの歴史背景

そもそもJavaの標準の日付系のAPIって:

  • java.util.Date
  • java.util.Calendar
  • java.sql.Date
  • XMLGregorianCalendar

で混乱するよね。

レビューするときには「パッケージ間違えてないか」「月が0-11になってるか」「タイムゾーンの扱いは?」とか気になりますね。
あと、おまけで「setLenientどうしてるか?」も。

てことで、Javaの日付と時刻周りの歴史背景から。

Date and Time API (1) -- Java SE 8 時代の日付と時刻の扱い方 - Programming Studio

Calendar.Builder とかできたのね。便利そう。
っていっても Calendar.getInstance() より new GregorianCalendar() でいいやと思うので、あんまり関係ないけど(怒られそうー)。

java.util.Date―その悲劇と歴史 - Programming Studio

色々不満を言われても、手を加えずに過去の互換性を大切にしてくれてるおかげで僕は楽をできてるので。ありがたいです。トレードオフってことですね。

もう既にあんまり Date とか Calendar 使ってなくて。joda-timeの DateTime を使ってるので。
Date and Time APIに移行したいと思えるかどうか。ってところかなー。

ISO8601

ISO 8601 -- Date and Time API の基礎理論(1) - Programming Studio

ISO 8601 -- Date and Time API の基礎理論(2) - Programming Studio

'T'とか'Z'とか出てきてなにこれー?ってなったときにISO8601のさわりだけ勉強したなー。+0900なのか+09:00なのかとかも。
これは知っておく方が良いね。

そういえば、元号はJava6から対応してて、プロパティファイルに書いてあった記憶がある。
将来的に変わるときには、そこが更新されるんだろうな。それかとりあえず自分で書き足すか。 日本人的にこの話をするのは憚られてしまいますが。

Date and Time APILocalDate

Date and Time API (2) -- Date and Time API の基礎 - Programming Studio

さて、いよいよこっからがDate and Time APIの話ですね。まずは LocalDate

[Tips] Calendar では、例えば 2014 年 2 月 30 日を指定してインスタンスを作成すると、2014 年 3 月 2 日として解釈されました。一方、Date and Time API では無効な日付を指定することができません。

ほほー。

of メソッドは LocalDate を返します。すなわち、of によるインスタンス作成を起点として、メソッド・チェーンで日付に対する操作を行うことができます。

メソッドチェーン便利よね。

あー。朝勉強時間のタイムアップだ。明日また LocalDate から見ていこう。