LoginSignup
4
5

More than 5 years have passed since last update.

Calendarの時間の部分をクリアしたいときのメモ

Posted at

これは何?

Calendarで取得した日時データの時間の部分をクリアしたいときの自分用メモ。

まずはググると出てくる例

calenderObj.clear(Calendar.HOUR_OF_DAY);
calenderObj.clear(Calendar.HOUR);
calenderObj.clear(Calendar.MINUTE);
calenderObj.clear(Calendar.SECOND);
calenderObj.clear(Calendar.MILLISECOND);

何が間違っているのか?

プログラムを書いて確認してみる。


import java.util.Calendar;

public class CalendarClear {

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();
        sysout(calendar);

        calendar.clear(Calendar.HOUR);
        calendar.clear(Calendar.MINUTE);
        calendar.clear(Calendar.SECOND);
        calendar.clear(Calendar.MILLISECOND);
        sysout(calendar);

        calendar.clear(Calendar.HOUR_OF_DAY);
        sysout(calendar);

    }

    private static final void sysout(Calendar calc) {

        System.out.println("/--------------------");

        System.out.println("YEAR:" + calc.get(Calendar.YEAR));
        System.out.println("MONTH:" + calc.get(Calendar.MONTH));
        System.out.println("DATE:" + calc.get(Calendar.DATE));
        System.out.println("HOUR_OF_DAY:" + calc.get(Calendar.HOUR_OF_DAY));
        System.out.println("HOUR:" + calc.get(Calendar.HOUR));
        System.out.println("MINUTE:" + calc.get(Calendar.MINUTE));
        System.out.println("SECOND:" + calc.get(Calendar.SECOND));
        System.out.println("MILLISECOND:" + calc.get(Calendar.MILLISECOND));

    }

}

結果はこうなる。

/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:25
SECOND:35
MILLISECOND:527
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:0
SECOND:0
MILLISECOND:0
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:0
SECOND:0
MILLISECOND:0

HOUR_OF_DAY、HOURの値がクリアされていない。
正しい記述はこれ。

public static void main(String[] args) {

    Calendar calendar = Calendar.getInstance();
    sysout(calendar);

    calendar.clear(Calendar.MINUTE);
    calendar.clear(Calendar.SECOND);
    calendar.clear(Calendar.MILLISECOND);
    // 時の部分をクリアするには、setで入れないといけない。
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    sysout(calendar);

    calendar.clear();
    sysout(calendar);

}

JavaDocにもちゃんと明記されている。
Calendar (Java Platform SE 7 )

HOUR_OF_DAY、HOUR、および AM_PM フィールドはそれぞれ別個に処理され、時間の解決規則が適用されます。
フィールドのいずれかをクリアしても、この Calendar の「時」はリセットされません。
「時」の値をリセットするには、set(Calendar.HOUR_OF_DAY, 0) を使用します。

処理結果。

/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:27
SECOND:12
MILLISECOND:718
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:0
HOUR:0
MINUTE:0
SECOND:0
MILLISECOND:0

おまけ

calendar.clear();

をやると、

/--------------------
YEAR:1970
MONTH:0
DATE:1
HOUR_OF_DAY:0
HOUR:0
MINUTE:0
SECOND:0
MILLISECOND:0

全項目がクリアされる。

Calendar (Java Platform SE 7 )

この Calendar のすべてのカレンダフィールド値および時間値 (元期からのミリ秒単位のオフセット) を未定義に設定します。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5