java-beginner.com ブログ

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

Calendarで日を取得

投稿日:

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

アイキャッチ

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

今回もCalendarクラスを扱います。getメソッドで引数をCalendar.DATEにして実験しました。

Calendar.DATE

ソースを見るとDATEは「public final static int DATE = 5;」と定義されてますが、この数値自体は意識する必要ありません。API仕様書には日を示すフィールド値とありますのでget(Calendar.DATE)と記述すれば、Calendarクラスのインスタンスが保持している日が取得できます。

今回のプログラムは前半と後半があります。前半では1970年1月で実験してます。月が変わっても日が取得できることを確認しました。後半では2016年2月と2017年2月で月末の様子を調べました。2016年がうるう年です。前半、後半どちらもsetTimeInMillisで日付を設定しています。

ソースと実行結果

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

ソースコード

package calendarTest;

import java.util.Calendar;

public class HeloGetDate {

    public static void main(String[] args) {

        Calendar c = Calendar.getInstance();
        c.clear();

        System.out.println("--------------------");
        System.out.println("前半");
        System.out.println("--------------------");

        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        c.setTimeInMillis(1000L * 60L * 60L * 15L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        c.setTimeInMillis(1000L * 60L * 60L * 15L + 1000L * 60L * 60L * 24L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        c.setTimeInMillis(1000L * 60L * 60L * 15L + 1000L * 60L * 60L * 24L * 29L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        c.setTimeInMillis(1000L * 60L * 60L * 15L + 1000L * 60L * 60L * 24L * 30L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        System.out.println("--------------------");
        System.out.println("後半");
        System.out.println("--------------------");

        long timeInMillis20160201 = 1454252400000L;
        long timeInMillis20170201 = 1485874800000L;

        c.setTimeInMillis(timeInMillis20160201 + 1000L * 60L * 60L * 24L * 27L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        c.setTimeInMillis(timeInMillis20160201 + 1000L * 60L * 60L * 24L * 28L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        c.setTimeInMillis(timeInMillis20170201 + 1000L * 60L * 60L * 24L * 27L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

        c.setTimeInMillis(timeInMillis20170201 + 1000L * 60L * 60L * 24L * 28L);
        System.out.println(c.getTime());
        System.out.println(c.get(Calendar.DATE));

    }

}

結果

--------------------
前半
--------------------
Thu Jan 01 00:00:00 JST 1970
1
Fri Jan 02 00:00:00 JST 1970
2
Sat Jan 03 00:00:00 JST 1970
3
Sat Jan 31 00:00:00 JST 1970
31
Sun Feb 01 00:00:00 JST 1970
1
--------------------
後半
--------------------
Sun Feb 28 00:00:00 JST 2016
28
Mon Feb 29 00:00:00 JST 2016
29
Tue Feb 28 00:00:00 JST 2017
28
Wed Mar 01 00:00:00 JST 2017
1

解説

プログラム後半では突然long型変数使ってますが、あらかじめミリ秒を調べました。このミリ秒はどのように調べたかというと、set(int year, int month, int date)メソッドで年月日を設定し、getTimeInMillis()メソッドでミリ秒を取得し、コンソールに出力して確認しました。上記プログラムではsetTimeInMillisばかり使ってますが、set(int year, int month, int date)メソッドを使う場面の方が多い気がします。