Hatena::Groupprogram

ひとり開発日記。 このページをアンテナに追加 RSSフィード

2010/11/20 (Sat)

Joda-Timeで17歳教

| Joda-Timeで17歳教 - ひとり開発日記。 を含むブックマーク はてなブックマーク - Joda-Timeで17歳教 - ひとり開発日記。

簡単過ぎる例だと、イマイチJoda-Timeの良さが伝わりきらない気がするので、割と具体的な例を実装してみました。

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.format.DateTimeFormat;

/** 17歳教 */
public class Seventeen {

    public static void main(String[] args) {
        // 誰かの誕生日
        String birthDay = "1964/09/25";
        // 誕生日の文字列をDateTime型に変換
        DateTime birthDateTime = DateTimeFormat.forPattern("yyyy/MM/dd").parseDateTime(birthDay);
        // 17歳の誕生日
        DateTime seventeenthBirthDateTime = birthDateTime.plusYears(17);
        // なう
        DateTime now = new DateTime();
        // 出力
        System.out.println(now.toString("本日 yyyy年MM月dd日"));

        // 期間タイプは、月日(年月日から年を除いたもの)
        PeriodType periodType = PeriodType.yearMonthDay().withYearsRemoved();
        // 期間を求める
        Period period = new Period(seventeenthBirthDateTime, now, periodType);
        // 経過月日を取得
        int months = period.getMonths();
        int days = period.getDays();
        String beforeAfter = (months < 0 || days < 0) ? "まで" : "と";
        // 出力
        System.out.println(String.format("17歳%s%dヶ月%d日", beforeAfter, Math.abs(months), Math.abs(days)));

        // 経過日数を求める
        int days2 = Days.daysBetween(seventeenthBirthDateTime, now).getDays();
        String beforeAfter2 = (days2 < 0) ? "まで" : "と";
        // 出力
        System.out.println(String.format("17歳%s%d日", beforeAfter2, Math.abs(days2)));
    }
}

結果。

本日 2010年11月20日
17歳と349ヶ月26日
17歳と10648日

少々冗長に書いてますけど、上記ソース、日時計算においては、四則演算、条件分岐、ループを使ってないのがミソ、って言うか、オブジェクトを作成して、メソッド実行のみ、なのが分かるでしょうか。 まぁ、オブジェクト指向言語なら、それが当たり前なんですけどね…。

トラックバック - http://program.g.hatena.ne.jp/halflite/20101120