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

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

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

記事を読む

no image

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

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

記事を読む

icatch-upload_1229138273_mini-thumbnail

InputStream に格納されているストリームデータのサイズを取得する

Jersey を使った Web アプリを作成中なんですが、 enctype="multipart/f

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

icatch-zip_524574337_mini-thumbnail

Java でファイルが1つだけ圧縮された zip を解凍するサンプル

ファイルが1つだけ圧縮された zip を解凍するサンプルです。 単一ファイルが圧縮された zip

記事を読む

no image

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

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

記事を読む

no image

Java から VBScript を使って Excel を印刷する

背景 Java のデスクトップアプリを作成していたときの要件に「Excel で作成された帳票を印刷

記事を読む

no image

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

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

記事を読む

icatch-thumbnail

レスポンスにサムネイル画像を返す API のサンプル

今回は直接 ImageMagick は関係ありませんが、また画像ネタです。この辺りのことを仕事で扱っ

記事を読む

Googleアドセンス用(PC)

Message

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


× 4 = 十二

次の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 ↑