時間ねたが続くが Java で Date から時刻をリセットして日付だけを取り出そうとしてはまったのでメモ。

日付関係の処理はややこしい。タイムゾーンとか夏時間とか閏秒とか訳分からん。

Java の場合は java.util.Calendar が一手に引き受けてくれるのだが こいつがまた曲者ではまった。

結論だけ欲しい人の為の正解、

static Date clearTime(Date date) {
    Calendar cal = new GregorianCalendar();
    cal.setTime(date);
    cal.clear(Calendar.AM_PM);
    cal.clear(Calendar.HOUR);
    cal.clear(Calendar.HOUR_OF_DAY);
    cal.clear(Calendar.MINUTE);
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MILLISECOND);
    return cal.getTime();
}

これで、もろもろの面倒を考えずに日付だけが取り出せる。

単純に考えると

    cal.clear(Calendar.HOUR);
    cal.clear(Calendar.MINUTE);
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MILLISECOND);

だけで良さそうだがこれだとこうなる。

2013/04/07 14:00:00.000

AM_PMリセットしても

    cal.clear(Calendar.AM_PM);

こうだったりする。

2013/04/07 02:00:00.000

結局、AM_PM をクリアしてから HOURHOUR_OF_DAY の両方をクリアする必要があるという謎な仕様。

普通に Calendar.clearTime() が有っても良いと思うんだが...