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の時間にしなければいけません。