Date and Time APIについて調べてみた その5

【前提条件】

[環境]
[参考資料]

Java8 APIドキュメント
http://docs.oracle.com/javase/jp/8/api/

【概要】

今回は期間、時間などの取り扱いについて調べてみました。

Date and Time APIでは時刻などの瞬間ごとのクラスだけではなく、
期間などの時間を情報として扱うクラスが追加されています。

【Duration/Period】

時間を表すクラスはDurationクラスとPeriodクラスがあります。

Durationクラスはナノ秒から日までを扱い、
Periodクラスは日から年までを扱います。

[サンプルコード]
public class Sample {

    public static void main(final String[] args) {

        createPeriod();
        createDuration();
    }

    public static void createPeriod() {

        System.out.println("================ Period ================");

        System.out.println("of : " + Period.of(10, 3, 5));

        System.out.println("ofYears : " + Period.ofYears(10));
        System.out.println("ofMonths : " + Period.ofMonths(23));
        System.out.println("ofWeeks : " + Period.ofWeeks(12));
        System.out.println("ofDays : " + Period.ofDays(120));

        System.out.println("between : " +
                Period.between(LocalDate.of(2010, 7, 11), LocalDate.now()));

        System.out.println("================ Period ================");
    }

    public static void createDuration() {

        System.out.println("================ Dutaion ================");

        System.out.println("of : " + Duration.of(54, ChronoUnit.HOURS));

        System.out.println("ofDays : " + Duration.ofDays(120));
        System.out.println("ofHours : " + Duration.ofHours(33));
        System.out.println("ofMinutes : " + Duration.ofMinutes(15));
        System.out.println("ofSeconds : " + Duration.ofSeconds(40));
        System.out.println("ofMillis : " + Duration.ofMillis(1200));
        System.out.println("ofNanos : " + Duration.ofNanos(12345678));

        System.out.println("between : " + 
                Duration.between(
                    LocalDateTime.of(2014, 6, 11, 10, 05), LocalDateTime.now()));

        System.out.println("================ Dutaion ================");
    }
}

最初はofメソッドです。
Periodクラスでは年月日を
Durationクラスでは日付の単位と数値を指定します。

2つ目ofXXXsメソッドです。
XXXにはYearやHourなど時間の単位の単語が入ります。
パラメータは数値です。


3つ目はbetweenメソッドです。
betweenメソッドは二つの時刻と時刻の期間を返します。
Periodクラスの場合はLocalDateクラスのオブジェクトを
Durationクラスの場合はTemporalインターフェイスのオブジェクト渡します。

LocalDateやLocalTimeなどは
Temporalインターフェイスを実装しているので
パラメータとして渡すことが出来ます。

[実行結果]
================ Period ================
of : P10Y3M5D
ofYears : P10Y
ofMonths : P23M
ofWeeks : P84D
ofDays : P120D
between : P3Y11M9D
================ Period ================
================ Dutaion ================
of : PT54H
ofDays : PT2880H
ofHours : PT33H
ofMinutes : PT15M
ofSeconds : PT40S
ofMillis : PT1.2S
ofNanos : PT0.012345678S
between : PT228H52M37.281S
================ Dutaion ================

Periodクラスの場合はPで始まり、
Durationクラスの場合はPTで始まります。

それ以降は「n + 日付・時刻の単位」で表現します。
年であれば「10Y」、時であれば「10H」で表現します。

文字列からPeirod/Durationクラスに変換する
parseメソッドでも同じ形式で指定する必要があります。

【まとめ】

旧来の日付クラスでは独自に作る必要があった
期間・時間に関する情報を
標準のAPIで扱えるようになるのがわかりました。

年齢や○○期間(入社期間とか開始期間)などは
システムで扱うことが珍しくないので、
Periodクラスに関しては使用頻度は高いのではないでしょうか。