こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

Calendarで月末までの日数取得

こんにちは。「Javaを復習する初心者」です。前回は月末を取得する方法を扱いました。今回は月末までの日数を取得するプログラムを書こうと思います。

今回は以下の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つ作っていますが、こちらの方が速いという結果になりました。