web-dev-qa-db-ja.com

LocalDateからJava.sql.Dateに移動する正しい方法は何ですか

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
13
Zipper

適切な変換は次のとおりです。

    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);

そして、セッターについても同じです。

11
leonbloy

ジョダの現地の日付を教えてください

LocalDate loc = //...  

次の方法で、ゾーンに依存せずにJava.sql.Dateに変換できます。

Date date = new Date(loc .getYear() - 1900, loc .getMonthOfYear() - 1, loc .getDayOfMonth());

または

Date date = Date.valueOf(l.toString());
4
Ilya