こんにちは。「Javaを復習する初心者」です。
前回は月末を取得する方法を扱いました。今回は月末までの日数を取得するプログラムを書こうと思います。
2つの方法
今回は以下の2つの方法を使いました。計算には月末の日付が必要になりますが、その方法が前回同様に異なります。2016年2月1日で月末までの日数を取得することにします。
- getActualMaximumメソッドを使う方法
-
- インスタンスを生成し変数cに格納
- clearメソッド呼び出し
- 2016年2月1日を設定
- c.getActualMaximum(Calendar.DATE) – c.get(Calendar.DATE)を出力
- 2つのインスタンスを使って日数の差を計算する方法
-
- インスタンスを生成し変数cに格納
- clearメソッド呼び出し
- 翌月初日から1日減算
- インスタンスを生成しcTempに格納
- 2016年2月1日を設定
- 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つ作っていますが、こちらの方が速いという結果になりました。