これは何?
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 のすべてのカレンダフィールド値および時間値 (元期からのミリ秒単位のオフセット) を未定義に設定します。