Hatena::Groupprogram

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

2010/11/20 (Sat)

Date型から、年月日をそれぞれInteger型で取得したい。

| Date型から、年月日をそれぞれInteger型で取得したい。 - ひとり開発日記。 を含むブックマーク はてなブックマーク - Date型から、年月日をそれぞれInteger型で取得したい。 - ひとり開発日記。

タイトルで出オチですけど。 前回書いた記事*1に、検索して辿り着く人の多いこと!!

  1. 集合の操作
  2. 日時計

思うに、Javaの辛さのツートップは、上記二つじゃないかと思うのです。 集合の操作はguava-librariesで、そして、日時計算はJoda-Timeで解決ですよ!!

// なう
Date nowDate = new Date();
// DateTime型に変換
DateTime nowDateTime = new DateTime(nowDate);
// 年
int year = nowDateTime.getYear();
// 月
int month = nowDateTime.getMonthOfYear();
// 日
int day = nowDateTime.getDayOfMonth();
System.out.println(year);
System.out.println(month);
System.out.println(day);

// 日付フォーマットを指定して文字列化
System.out.println(nowDateTime.toString("yyyy/MM/dd"));

結果。

2010
11
20
2010/11/20

嗚呼、なんて楽なんでしょう!!

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