ひがやすを技術ブログ

電通国際情報サービスのプログラマ

java.util.Dateをjava.sql.Dateにきちんと変換する方法

多くの人はこうやればいいと思っているかもしれません。

java.util.Date d = new java.util.Date();
java.sql.Date d2 = new java.sql.Date(d.getTime());

確かにこれでも一応変換はできますが、きちんと変換してはいません。java.sql.DateのJavadocを見るとこう書いてあります。


SQL DATE の定義に対応させるために、java.sql.Date のインスタンスでラップされたミリ秒の値は、インスタンスが関連した特定のタイムゾーンで時間、分、秒、ミリ秒をゼロに設定することで、「標準化」する必要があります。


つまり、java.util.Date#getTime()をjava.sql.Dateにただ渡すだけでは不十分で、「特定のタイムゾーンで時間、分、秒、ミリ秒をゼロに設定しなければいけない」のです。それも、開発者が。
では、きちんと変換するコードを見てみましょう。

java.util.Date d = new java.util.Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
java.sql.Date d2 = new java.sql.Date(cal.getTimeInMillis());


ちなみに、java.util.Dateをjava.sql.Timeに変換するには次のようにします。

java.util.Date d = new java.util.Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
cal.set(Calendar.YEAR, 1970);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DATE, 1);
java.sql.Time t = new java.sql.Time(cal.getTimeInMillis());

TimeにわたすUTCの値は、1970-01-01の時間にしなければいけません。