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

【前提条件】

[環境]
[参考資料]

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

【概要】

前回は期間・時間のオブジェクトの生成について調べました。

toStringで出力していましたので、
「PnYnMnD」や「PTnHnMnS」などPeriod/Durationのフォーマットで出力されていました。

今回は「n年ヶ月」と「n時間n分n秒」と言う形で出力したいと思います。

【Periodクラス】

Periodクラスを使って「n歳ヶ月」で出力してみます。

[サンプルコード]
    public static void formatPeriod() {

        final LocalDate now = LocalDate.now();
        final LocalDate birthDay = LocalDate.of(1986, 12, 16);
        final Period period = Period.between(birthDay, now);

        System.out.println(period.getYears() + "歳" + period.getMonths() + "ヶ月");
    }

PeriodクラスにはgetYearsメソッドなどの
各時間単位の値を取得するメソッドがある程度提供されています。

今回は年と月を使っています。

[出力結果]
27歳6ヶ月

なんとなく年齢っぽい形で出力がすることが出来ました。

【Durationクラス】

今度はDurationクラスを使って「n時間n分n秒」と言う形で
出力したいと思います。

[サンプルコード]
    public static void formatDuration() {
        final LocalTime sleepTime = LocalTime.of(3, 2, 12);
        final LocalTime wakeUpTime = LocalTime.of(9, 10, 45);
        final Duration duration = Duration.between(sleepTime, wakeUpTime);

        final String formatValue =
                duration.toString()
                        .replace("PT", "")
                        .replace("H", "時間")
                        .replace("M", "分")
                        .replace("S", "秒");
        System.out.println(formatValue);
    }

DurationクラスはPeriodを違って、
時間や分などの単位時間の値を出力するメソッドが
ほとんどありません。

getNanoメソッドとgetSecondsメソッドのみです。
なので、「n時間n分n秒」と言う形で出力するために
「PTnHnMnS」形式から無理矢理変換しています。

[出力結果]
6時間8分33秒

なんとか「n時間n分n秒」と言う形で出力できました。

【まとめ】

Periodクラスに関しては年月日を取得するメソッドが提供されているので、
扱いやすいクラスになっています。

Durationクラスについては秒とナノ秒しかメソッドから
取得できないので若干使いにくいかもしれません。

実はフォーマットできるメソッドがあるかもしれませんが、
Period/Durationクラスには提供されていないようです。