指定した年月の日付を Calendar オブジェクトの一覧で取得する

公開日: : 最終更新日:2014/01/26 Java ,

小ワザです。
業務で、指定した年月の日付を Calendar オブジェクトの一覧で取得する必要があり実装しました。
またどこかで使いそうだなぁと思ったので、このブログにもメモしておきます。

medium_2055608272

目次

1. 動作環境

1-1. Java

どのバージョンでも動くので載せなくてもいいかと思いましたが念のため。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

2. 指定した年月日からその月末までの日付を Calendar オブジェクトの一覧で取得する

実装コードは次の通りです。

/**
 * 指定した年月の Calendar オブジェクトの一覧を取得する。
 * 
 * <code>startDate</code> で取得開始日を指定することができる。
 * 1 を指定した場合は月初から月末までの Calendar オブジェクトの一覧を取得する。
 * 
 * 時分秒は常に 00:00:00 を設定する。
 * 
 * @param year 年
 * @param month 月
 * @param startDate 取得開始日
 * @return
 */
public static List<Calendar> getCalendars(int year, int month, int startDate) {
    List<Calendar> dates = new ArrayList<Calendar>();

    Calendar instance = Calendar.getInstance();
    instance.set(Calendar.YEAR, year);
    instance.set(Calendar.MONTH, month);
    int lastDate = instance.getActualMaximum(Calendar.DATE);
    for(int date = startDate; date <= lastDate; date++) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, date, 0, 0, 0);
        dates.add(cal);
    }
    return dates;
}

テストケースは次の通りです。
こんな感じに使えます。

private static final int YEAR = 2014;
private static final int MONTH = Calendar.JANUARY;

public static class GetCalendars {
    
    @Test
    public void test_2014年1月21日から31日までのCalendarオブジェクトを取得する() throws Exception {
        // Setup
        int startDate = 21;

        // Exercise
        List<Calendar> actual = CalendarUtil.getCalendars(YEAR, MONTH, startDate);

        // Verify
        assertThat(actual.size(), is(11));
        
        Calendar calendar = actual.get(0);
        assertThat(calendar.get(Calendar.YEAR), is(YEAR));
        assertThat(calendar.get(Calendar.MONTH), is(MONTH));
        assertThat(calendar.get(Calendar.DATE), is(startDate));
        assertThat(calendar.get(Calendar.HOUR_OF_DAY), is(0));
        assertThat(calendar.get(Calendar.MINUTE), is(0));
        assertThat(calendar.get(Calendar.SECOND), is(0));
        
        calendar = actual.get(actual.size() - 1);
        assertThat(calendar.get(Calendar.DATE), is(31));
        
    }

    @Test
    public void test_2014年1月1日から31日までのCalendarオブジェクトを取得する() throws Exception {
        // Setup
        int startDate = 1;
        
        // Exercise
        List<Calendar> actual = CalendarUtil.getCalendars(YEAR, MONTH, startDate);

        // Verify
        assertThat(actual.size(), is(31));
    }
}

3. 指定した年月の月初から月末までの日付を Calendar オブジェクトの一覧で取得する

上記の CalendarUtil#getCalendars の第3引数に 1 を設定すればいいだけなので実装コードは次の通りです。

/**
 * 指定した年月の Calendar オブジェクトの一覧を取得する。
 * 
 * 例えば、次のパラメータを指定した場合、、、
 * 
 * <ul>
 * <li>year → 2014</li>
 * <li>month → 1</li>
 * </ul>
 * 
 * 取得するリストは次のようになる。
 * 
 * <ul>
 * <li>リストのサイズは 31</li>
 * <li>リストの先頭は 2014/01/01 の Calendar オブジェクト</li>
 * <li>リストの末尾は 2014/01/31 の Calendar オブジェクト</li>
 * </ul>
 * 
 * @param year 年
 * @param month 月
 * @return
 */
public static List<Calendar> getCalendarsOfOneMonth(int year, int month) {
    return getCalendars(year, month, 1);
}

テストケースは次の通りです。
こんな感じに使えます。

private static final int YEAR = 2014;
private static final int MONTH = Calendar.JANUARY;

public static class GetCalendarsOfOneMonth {
    
    @Test
    public void test_2014年1月のCalendarオブジェクトを取得する() throws Exception {
        // Exercise
        List<Calendar> actual = CalendarUtil.getCalendarsOfOneMonth(YEAR, MONTH);
        
        // Verify
        assertThat(actual.size(), is(31));
    }
}

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

Functions#compose() を使って Function を合成するサンプル(Java8 との比較付き)

Java8 と GoogleGuava の Function について コードの違いを書いた。 その

記事を読む

icatch_2185253176-resized

Java8 の Optional 型を返す Generics を使ったメソッドを定義する

Java8 の Optional とガード節 に続いて Java8 の Optional ネタ。今回

記事を読む

GradleLogoReg

Gradle で Java アプリのプロジェクトを作成して Eclipse にインポートするまでの手順

Mac に SDKMAN! を使って Gradle をインストールしたので、実際にプロジェクトを作成

記事を読む

icatch-3361b5e1-resized

Optional型の変数にget()とifPresent()は使わない

Java8 から導入された Optional を勉強するため、過去にプライベートで書いたコードに O

記事を読む

no image

Exec Maven Plugin で maven コマンドでアプリを起動する

packaging タグに "jar" を指定した Maven プロジェクトをコマンドラインから起動

記事を読む

no image

ファイルの拡張子が JPG であるかを問い合わせるスニペット

特に目新しいこともないが、同じようなことをする機会があるかもしれないのでメモ。Gist にも登録済み

記事を読む

no image

Jetty でシンプルなプロジェクトを作成してみた

プロトタイプを作成するなら Tomcat よりも Jetty のほうがさらっと出来そうだなぁ、と今さ

記事を読む

no image

プロセスの起動を確認するプログラム

プロセスが起動しているかを確認するプログラムを Java で書いてみました。Excel のプロセス確

記事を読む

no image

google-gson でシリアライズ・デシリアライズしたサンプル

これまで Java で JSON を扱うときは JSONIC を使っていたが、google-gson

記事を読む

no image

ディレクトリに関するユーティリティ

ディレクトリに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


6 − = 二

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑