2013-09-25 37 views
11

我有一個LocalDate,我試圖將其轉換爲java.sql.Date以將其存儲在數據庫的日期字段中。我的問題是,當我將它轉換爲java.sql.Date時,由於我在EST中運行的機器,它已經落後了一天。我將Joda.DateTime設置爲UTC,並通過使用millis構造函數創建java.sql.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" 

java.util.Date創建我猜想那是因爲我的機器我測試的是EST,和LocalDate使用UTC,但我不確定正確的解決方法是什麼。我意識到我可以得到當地的時區,並將其添加到millis,但這似乎是一個hacky修復程序。有沒有適當的方法來做到這一點,我只是想念?


與米利斯更新爲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的毫秒值和UTIL'Date'對象? –

回答

7

正確轉換爲:

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

而且對於setter來說也是一樣。

-2

您應該創建和使用的java.sql.Timestamp,而不是一個java.sql.Date。 按規範,java.sql.Date沒有時間元素。

要LOCALDATE的轉換爲時間戳:

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 = //... 

你可以用帶獨立CONVER到java.sql.Date,在接下來的方式:

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

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

這個構造函數已被棄用 –

0

如果您發現通過搜索如何轉換Java 8 L ocalDate,這裏是你如何做到這一點:

公共靜態日期的valueOf(LOCALDATE的日期)

獲取日期的實例,從月值相同 年,月,日作爲一個LOCALDATE的對象給LocalDate。 提供的LocalDate被解釋爲本地時間 區域中的本地日期。參數:date - 要轉換的LocalDate:a日期 objectThrows:NullPointerException - 如果date爲nullSince:1。8

例如:

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

這使Joda LocalDate與Java 8 LocalDate混淆。問題是關於Joda LocalDate。 – oulenz

+1

@oulenz你是對的。我做了一個編輯來指出這一點。 – Tomasz