Java8 の Developer preview が公開されたので、そろそろ新機能についてまとめておきます。
の2回目は Date and Time API を中心に。
日時の扱いが Date and Time API として刷新された
腐っていた日時関連の API が改善されました。刷新のポイントは以下。
- Joda-Time を参考にした扱いやすいAPI定義
- 並列処理に耐えうるよう imutable なクラスとして定義
- 凶悪な SimpleDataFormat を使わなくて良い
日付と時間に関するクラス
java.time パッケージに以下のクラスが追加されています。
クラス | 説明 |
---|---|
LocalDate | 時間の情報を除いた'2010-12-03'のような日を表現する |
LocalTime | 日の情報を除いた、'11:30' のような時間を表現する |
LocalDateTime | '2010-12-03T11:30'のような日時を表現する |
ZonedDateTime | タイムゾーンを含めた日時を表現する |
java.time.LocalDate
LocalDate localDate = LocalDate.now(); System.out.println(localDate.toString()); //2013-09-15 System.out.println(localDate.getDayOfWeek().toString()); //SUNDAY System.out.println(localDate.getDayOfMonth()); //15 System.out.println(localDate.getDayOfYear()); //258 System.out.println(localDate.isLeapYear()); //false System.out.println(localDate.plusDays(12).toString()); //2013-09-27
java.time.LocalTime
LocalTime localTime = LocalTime.of(10, 20); System.out.println(localTime.toString()); //10:20 System.out.println(localTime.getHour()); //10 System.out.println(localTime.getMinute()); //20 System.out.println(localTime.getSecond()); //0 System.out.println(localTime.MIDNIGHT); //00:00 System.out.println(localTime.NOON); //12:00
java.time.LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime.toString()); // 2013-09-15T17:31:16.636 System.out.println(localDateTime.getDayOfMonth()); // 15 System.out.println(localDateTime.getHour()); // 17 System.out.println(localDateTime.getNano()); // 636000000
java.time.ZonedDateTime
ZonedDateTime zonedDateTime = ZonedDateTime.now(); System.out.println(zonedDateTime.toString()); // 2013-09-15T17:45:55.820+09:00[Asia/Tokyo] System.out.println(zonedDateTime.getDayOfMonth()); // 15 System.out.println(zonedDateTime.getHour()); // 17 System.out.println(zonedDateTime.getZone()); // Asia/Tokyo System.out.println(zonedDateTime.getOffset()); // +09:00
日時操作系メソッドのプレフィックス
日時操作は以下のプレフィックスを持ったメソッドで統一的に扱えます。
of | スタティックファクトリメソッド |
parse | 引数をパースしてインスタンスを生成するスタティックファクトリメソッド |
get | 何らかの値を取得 |
is | 何らかの論理判定 |
with | immutable なセッターを提供 |
plus | オブジェクトに値を加算 |
minus | オブジェクトに値を減算 |
to | オブジェクトを他のオブジェクトに変換 |
at | localDate.atTime(time) のようにこのオブジェクトに他を合成する |
LocalDateTime localDateTime; localDateTime = LocalDateTime.of(2013, 9, 15, 18, 05); System.out.println(localDateTime); // 2013-09-15T18:05 localDateTime = LocalDateTime.parse("2013-09-15T18:05:23"); System.out.println(localDateTime); // 2013-09-15T18:05:23
DateTimeFormatter でフォーマット指定
ofPattern で DateTimeFormatter を作成してフォーマットできます。
LocalDateTime localDateTime = LocalDateTime.of(2013, 9, 15, 18, 05); System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); // 2013/09/15 18:05:00
また、ISO フォーマットで事前定義された定数を利用することもできます。
LocalDateTime localDateTime = LocalDateTime.of(2013, 9, 15, 18, 05); System.out.println(localDateTime.format(DateTimeFormatter.ISO_WEEK_DATE)); // 2013-W37-7 System.out.println(localDateTime.format(DateTimeFormatter.ISO_DATE)); // 2013-09-15
DateTimeFormatter は文字列からインスタンスを作成する際にも使用できます。
LocalDateTime localDateTime = LocalDateTime.parse( "2013/09/15 18:05", DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"));
時間長と期間に関するクラス
クラス | 説明 |
---|---|
Instant | 1970/1/1を起点としたナノ秒単位のポイント |
Duration | ナノ秒単位での時間の長さを表現する |
Period | 人間にとって意味のある年や月などの期間を表現する |
java.time.Instant
Instant instant = Instant.now(); System.out.println(instant.toString()); //2013-09-15T05:20:08.145Z System.out.println(instant.plus(Duration.ofMillis(5000)).toString()); //2013-09-15T05:20:13.145Z System.out.println(instant.minus(Duration.ofMillis(5000)).toString()); //2013-09-15T05:20:03.145Z System.out.println(instant.minusSeconds(10).toString()); //2013-09-15T05:19:58.145Z
java.time.Duration
Duration duration = Duration.ofMillis(5000); System.out.println(duration.toString()); //PT5S duration = Duration.ofSeconds(60); System.out.println(duration.toString()); //PT1M duration = Duration.ofMinutes(10); System.out.println(duration.toString()); //PT10M duration = Duration.ofHours(2); System.out.println(duration.toString()); //PT2H duration = Duration.between(Instant.now(), Instant.now().plus(Duration.ofMinutes(10))); System.out.println(duration.toString()); //PT10M
java.time.Period
Period period = Period.ofDays(6); System.out.println(period.toString()); //P6D period = Period.ofMonths(6); System.out.println(period.toString()); //P6M period = Period.between(LocalDate.now(), LocalDate.now().plusDays(60)); System.out.println(period.toString()); //P1M29D
その他の値クラス
日時に関する概念を表すクラスが細かく定義されています。
クラス | 説明 |
---|---|
Month | Month.JANUARY などの月を表すenum |
DayOfWeek | DayOfWeek.MONDAY などの週の日を表すenum |
Year | 2014などの年を表現するクラス |
YearMonth | 日や時間無しで年と月を保持するクラス。クレジットカードの有効期限などで使える |
MonthDay | 年や時間無しで月と日を保持するクラス。誕生日などの表現で使える |
OffsetTime | 11:30+01:00 のように時間とUTCからのオフセット(LocalTime と ZoneOffset)を保持するクラス |
OffsetDateTime | 2010-12-03T11:30+01:00 のように日時とUTCからのオフセット(LocalDateTime と ZoneOffset)を保持するクラス |
Clock | システム日時をシミュレートする。テスト時など未来のシステム日付が必要な場合のSystem.currentTimeMillis()の代用となる |
Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)
- 作者:Cay S. Horstmann
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: 単行本(ソフトカバー)