DBの日付フィールドに保存するためにJava.sql.Date
に変換しようとしているLocalDate
があります。私の問題は、それをJava.sql.Date
に変換すると、ESTで実行しているマシンが原因で、1日遅れることです。 Joda.DateTime
をUTCで設定し、millisコンストラクターを使用してJava.sql.Date
を作成します。さまざまな値が何であるかを確認できるように、デバッグウォッチの出力を含めています。
item.getDate().toDateTimeAtStartOfDay() = {org.joda.time.DateTime@6079}"2013-09-25T00:00:00.000Z"
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380067200000
new Java.sql.Date(item.getDate().toDateTimeAtStartOfDay().getMillis()) = {Java.sql.Date@6082}"2013-09-24"
item.getDate().getLocalMillis() = 1380067200000
new Java.sql.Date(item.getDate().getLocalMillis()) = {Java.sql.Date@6083}"2013-09-24"
new Java.util.Date(item.getDate().getLocalMillis()) = {Java.util.Date@6103}"Tue Sep 24 20:00:00 EDT 2013"
Java.util.Date
の作成から、テストしているマシンがESTにあり、LocalDateがUTCにあるためだと思いますが、これを修正する正しい方法がわかりません。ローカルタイムゾーンを取得してミリ秒に追加できることはわかっていますが、それはハッキーな修正のようです。私がちょうど欠けているこれを行うための適切な方法はありますか?
Java.util.Date
のミリ秒で更新します
new Java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380153600000
item.getDate() = {org.joda.time.LocalDate@5812}"2013-09-26"
new Java.sql.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000
new Java.util.Date(item.getDate().getLocalMillis()) = {Java.util.Date@5842}"Wed Sep 25 20:00:00 EDT 2013"
new Java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000
適切な変換は次のとおりです。
public static final DateTimeZone jodaTzUTC = DateTimeZone.forID("UTC");
// from Java.sql.Date to LocalDate:
public static LocalDate dateToLocalDate(Java.sql.Date d) {
if(d==null) return null;
return new LocalDate(d.getTime(), jodaTzUTC);
}
// from LocalDate to Java.sql.Date:
public static Java.sql.Date localdateToDate(LocalDate ld) {
if(ld==null) return null;
return new Java.sql.Date(
ld.toDateTimeAtStartOfDay(jodaTzUTC).getMillis());
}
これをDAOヘルパーロジックで使用します。 JDBCでは、次のことを行う必要があります
public static final Calendar calendarUTC = Calendar.getInstance(
TimeZone.getTimeZone("UTC"));
d = rs.getDate(i, calendarUTC);
そして、セッターについても同じです。
ジョダの現地の日付を教えてください
LocalDate loc = //...
次の方法で、ゾーンに依存せずにJava.sql.Date
に変換できます。
Date date = new Date(loc .getYear() - 1900, loc .getMonthOfYear() - 1, loc .getDayOfMonth());
または
Date date = Date.valueOf(l.toString());