Date and Time APIについて調べてみた その5
【概要】
今回は期間、時間などの取り扱いについて調べてみました。
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クラスに関しては使用頻度は高いのではないでしょうか。