指定した年月の日付を 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

Spark を使って JSON を返すシンプルな API を書いてみた

必要に迫られてモックの API を作成することになった。 大した工数を割けないので使ったことのある

記事を読む

no image

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

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

記事を読む

no image

サーブレットでクラスパス上にあるプロパティファイルを参照するスニペット

よく使うわりにはいつも調べているのでいい加減メモすることにした。 "app.proper

記事を読む

no image

画像ファイルを選別するFilenameFilter

画像ファイルのみアップロードを許可する仕様があって、何てことはないがフィルターを作って対応したのでメ

記事を読む

no image

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

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

記事を読む

icatch_4610898091-resized

Java8 の Optional とガード節

メソッドの冒頭で条件チェックを行い、条件を満たしていない場合はさっさと return してしまう「ガ

記事を読む

no image

Stream#filter()で絞り込みmap()で処理するコードスニペット

Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン

記事を読む

no image

画像ファイルのサイズ(縦横じゃなくて容量)を取得するスニペット

File#length で取得できるとは知らなかった。Gist にも登録済み。 /** * 画

記事を読む

GradleLogoReg

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

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

記事を読む

no image

Stream#map()とStream#collect()を使ってListを生成する

Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン

記事を読む

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 ↑