Calendarで久々にはまる
Javaで日付を比較するために時刻部分を0にしようとすることは多いだろう。
久々にぽかをかましてしまった。ぱっと見で間違いに気づきにくいのが厄介だ。
Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
だが、これでは動くときと動かないときがあるのだ。
午前中に比較すると成功して、午後に比較するとダメ。「Calendar.HOUR」は午前と午後を利用する12時間対応型なのだ。つまり、午前中に動かすと想定どおりに動くが午後だと24時間表記で12時にされるため、動かない。
したがって24時間で比較したいときには以下のようにする。
now.set(Calendar.HOUR_OF_DAY, 0);
久々にあほらしいことで悩んでしまった。
個人的には日付のみをあらわすDate、時刻のみを表すTime、日付と時刻を表すDateTimeと分かれていないのがJavaの日付の扱いにくさの原因だと思ってる。また、Java5対応していないために、定数が型チェックされないとかいろいろと。
Formatterは日本語対応してないし。月の文字列が省略形と詳細と丁寧にあるとか0から始まるとかは、やはりJavaが英語圏のためのものというあたりがよくわかる。日本だと数字として扱うからね。でもしっかり日本語対応されてjaロケールだと睦月、如月、弥生と表示されてもこまるかな。