読者です 読者をやめる 読者になる 読者になる

Java8 新機能についてのまとめ 2

Java

f:id:Naotsugu:20130915005711j:plain

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)

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)