java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

Calendarで月末までの日数取得

投稿日:

最終更新日:2016年07月18日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

前回は月末を取得する方法を扱いました。今回は月末までの日数を取得するプログラムを書こうと思います。

2つの方法

今回は以下の2つの方法を使いました。計算には月末の日付が必要になりますが、その方法が前回同様に異なります。2016年2月1日で月末までの日数を取得することにします。

getActualMaximumメソッドを使う方法
  1. インスタンスを生成し変数cに格納
  2. clearメソッド呼び出し
  3. 2016年2月1日を設定
  4. c.getActualMaximum(Calendar.DATE) – c.get(Calendar.DATE)を出力
2つのインスタンスを使って日数の差を計算する方法
  1. インスタンスを生成し変数cに格納
  2. clearメソッド呼び出し
  3. 翌月初日から1日減算
  4. インスタンスを生成しcTempに格納
  5. 2016年2月1日を設定
  6. c.get(Calendar.DATE) – cTemp.get(Calendar.DATE)を出力

2つ目の方法ではCalendarクラスのインスタンス生成が2回あります。

ソースと実行結果

以下はソースと実行結果です。

ソース

package calendarTest;

import java.util.Calendar;

public class HelloGetActualMaximumUntil {

    public static void main(String[] args) {

        test1();

        test2();

    }

    private static void test1() {
        Calendar c = Calendar.getInstance();
        c.clear();
        c.set(2016, 1, 1);
        int days = c.getActualMaximum(Calendar.DATE) - c.get(Calendar.DATE);
        System.out.println(days);
    }

    private static void test2() {
        Calendar c = Calendar.getInstance();
        c.clear();
        c.set(2016, 2, 1);
        c.add(Calendar.DATE, -1);
        c.get(Calendar.DATE);

        Calendar cTemp = Calendar.getInstance();
        cTemp.clear();
        cTemp.set(2016, 1, 1);

        int days = c.get(Calendar.DATE) - cTemp.get(Calendar.DATE);
        System.out.println(days);
    }
}

結果

28
28

どちらの方法でも28という結果が出ます。2016年はうるう年なので末日が29日です。従って1日から29日までの日数は28日です。前回は末日を取得する方法を比較しましたが、getActualMaximumメソッドを使う方が遅いという結果が出ました。

速さ比較

では今回のこの2つの方法はどちらの方が処理が速いのでしょうか。以下、試してみました。

ソース

package calendarTest;

import java.util.Calendar;

public class HelloGetActualMaximumUntil2 {

    public static void main(String[] args) {

        int loopCount = 1000;
        long startTime, endTime;

        startTime = System.currentTimeMillis();
        for (int i = 0; i < loopCount; i++) {
            test1();
        }
        endTime   = System.currentTimeMillis();
        System.out.println(endTime - startTime);

        startTime = System.currentTimeMillis();
        for (int i = 0; i < loopCount; i++) {
            test2();
        }
        endTime   = System.currentTimeMillis();
        System.out.println(endTime - startTime);

    }

    private static void test1() {
        Calendar c = Calendar.getInstance();
        c.clear();
        c.set(2016, 1, 1);
        int days = c.getActualMaximum(Calendar.DATE) - c.get(Calendar.DATE);
    }

    private static void test2() {
        Calendar c = Calendar.getInstance();
        c.clear();
        c.set(2016, 2, 1);
        c.add(Calendar.DATE, -1);
        c.get(Calendar.DATE);

        Calendar cTemp = Calendar.getInstance();
        cTemp.clear();
        cTemp.set(2016, 1, 1);

        int days = c.get(Calendar.DATE) - cTemp.get(Calendar.DATE);
    }
}

結果

87
19

やはりgetActualMaximumメソッドは時間がかかるようです。2つ目の方法はインスタンスを2つ作っていますが、こちらの方が速いという結果になりました。