2013-09-25 12 views
11

LocalDate私はjava.sql.Dateに変換してDBの日付フィールドに格納しようとしています。私の問題は、それをjava.sql.Dateに変換すると、ESTで動作しているマシンのために1日遅れていることです。 Joda.DateTimeをUTCに設定し、millisコンストラクタを使用してjava.sql.Dateを作成します。私は上のテストてる私のマシンがESTであるので、それがあると仮定していjava.util.Date作成からLocalDateからjava.sql.Dateに移動する正しい方法は何ですか

item.getDate().toDateTimeAtStartOfDay() = {[email protected]}"2013-09-25T00:00:00.000Z" 
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380067200000 
new java.sql.Date(item.getDate().toDateTimeAtStartOfDay().getMillis()) = {[email protected]}"2013-09-24" 
item.getDate().getLocalMillis() = 1380067200000 
new java.sql.Date(item.getDate().getLocalMillis()) = {[email protected]}"2013-09-24" 
new java.util.Date(item.getDate().getLocalMillis()) = {[email protected]}"Tue Sep 24 20:00:00 EDT 2013" 

、と私はデバッグの出力は、あなたが異なる値が何であるかを見ることができる時計を含めていますLocalDateはUTCですが、これを修正する正しい方法は何か分かりません。地元のタイムゾーンを取得してそれをミリ秒に追加することができたことは分かっていますが、これはハッキリな修正のようです。私はちょうど行方不明だこれを行う適切な方法はありますか?


ミリ秒で更新java.util.Date

new java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000 
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380153600000 
item.getDate() = {[email protected]}"2013-09-26" 
new java.sql.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000 
new java.util.Date(item.getDate().getLocalMillis()) = {[email protected]}"Wed Sep 25 20:00:00 EDT 2013" 
new java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000 
+0

ミリ秒SQLの値とDate'オブジェクト 'utilのは何ですか? –

答えて

7

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

私はDAOヘルパーロジックでこれを使用
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()); 
    } 

タイムスタンプにLOCALDATEを変換するには

。 JDBCで行う必要があります

public static final Calendar calendarUTC = Calendar.getInstance(
     TimeZone.getTimeZone("UTC")); 

d = rs.getDate(i, calendarUTC); 

そしてセッターと同じです。

-2

のためにあなたがたjava.sql.Timestamp、ないjava.sql.Dateを作成して使用する必要があります。 specによって、java.sql.Dateにはtime要素はありません。

Timestamp timestamp = new Timestamp(localDate.toDateMidnight().getMillis()); 

タイムスタンプにLocalDateTimeを変換するには:

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis()); 
+2

私は日付が必要なタイムスタンプは必要ありません、私はデータベースに日付を格納しています。 – Zipper

+0

LocalDateにはjava.sql.Dateのような時間要素もありません – Tristan

3

てみましょうあなたジョダのローカル日付が

LocalDate loc = //... 

あなたは、次の方法で、ゾーンの独立性とjava.sql.DateにそれをCONVERすることができます:あなたが見つかった場合

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

または

Date date = Date.valueOf(l.toString()); 
+0

このコンストラクタは非推奨です –

0

この質問を変換する方法を検索してJava 8 L ocalDate、ここにあなたがそれを行う方法です。

のpublic static日のvalueOf(LOCALDATE日)

はとして月の値の月と日、同じ 年とLOCALDATEオブジェクトから日付のインスタンスを取得しますLocalDateを指定します。提供された のLocalDateは、現地時間 ゾーンのローカル日付として解釈されます。パラメータ:date - 変換するLocalDate戻り値:a objectThrows:NullPointerException - 日付がnullSinceの場合:18

例:

Date sqlDate = Date.valueOf(localDateObject); 
+2

これはJoda LocalDateとJava 8 LocalDateを混同します。問題は、Joda LocalDateについてです。 – oulenz

+1

あなたは正しいです。これを指摘する編集をしました。 – Tomasz

関連する問題