指定した年月の日付を 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#filter()で絞り込みmap()で処理するコードスニペット

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

記事を読む

no image

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

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

記事を読む

no image

Google Guava の Function を使った文字列加工の FluentIterable サンプル

お客様の都合上 Java7 で開発している案件があるのだが、Java8 の Function とか

記事を読む

medium_182531101

ClassLoader を使って getResourceAsStream で取得したファイルを UTF-8 で読み込む

よく使う割には覚えられず毎回調べている気がするので備忘録としてメモしておきます。 文字コードを指定し

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

ファイルに関するユーティリティ

ファイルに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。 作成

記事を読む

no image

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

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

記事を読む

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 ↑