2008-12-05 35 views
6

我從數據庫中取回日期和時間。它們存儲在單獨的字段中,但我想將它們組合成一個反映日期/時間的java.util.Date對象。如何將java.util.Date對象與java.sql.Time對象組合?

這是我最初的方法,但它有缺陷。我總是最終得到一個應該是6小時的日期/時間。我認爲這是因爲時間有一個時區偏移以及日期,我真的只需要其中一個時區偏移。

有關如何做到這一點的任何建議,以便它能給我正確的日期/時間?

import java.sql.Time; 
import java.util.Calendar; 
import java.util.Date; 

import org.apache.commons.lang.time.DateUtils; 
    public static Date combineDateTime(Date date, Time time) 
     { 
      if (date == null) 
       return null; 
      Date newDate = DateUtils.truncate(date, Calendar.DATE); 
      if (time != null) 
      { 
       Date t = new Date(time.getTime()); 
       newDate = new Date(newDate.getTime() + t.getTime()); 
      } 
      return newDate; 
     } 

回答

10

我會把這兩個日期和時間爲日曆對象,然後用各種方法日曆從第二個對象中提取的時間值,並把它們放到第一位。

Calendar dCal = Calendar.getInstance(); 
    dCal.setTime(date); 
    Calendar tCal = Calendar.getInstance(); 
    tCal.setTime(time); 
    dCal.set(Calendar.HOUR_OF_DAY, tCal.get(Calendar.HOUR_OF_DAY)); 
    dCal.set(Calendar.MINUTE, tCal.get(Calendar.MINUTE)); 
    dCal.set(Calendar.SECOND, tCal.get(Calendar.SECOND)); 
    dCal.set(Calendar.MILLISECOND, tCal.get(Calendar.MILLISECOND)); 
    date = dCal.getTime(); 
+0

Calendar.getInstance()創建日曆的新實例,每一個電話。日曆的重量非常重,而且不是線程安全的。雖然這在技術上是一個正確的方法,但還有更好的方法去實現它。 – 2008-12-05 16:04:06

5

在做這些類型的事情時,使用Joda時間而不是Java自己的Date類。這是一個非常優秀的日期/時間API,使得您嘗試做的事情變得非常簡單和可靠。

1

假設您知道從數據庫中讀取時間的時區,您需要使用之前在Calendar上設置時區的ResultSet.getTime(String, Calendar)方法。 JDBC驅動程序將對時間進行必要的調整。

如果所有代碼都在服務器端運行,我強烈建議在常見時區(可能是UTC)對所有時間進行標準化,並在GUI中顯示渲染時進行適當轉換。

我也會使用JodaTime(http://joda-time.sourceforge.net),它會在未來爲您節省頭痛。

4

@Paul Tomblin是一個控制TimeZone問題的好方法,而且我知道有人會把「喬達時間」加入到混音中。其他答案都是不錯的,比下面的技巧更穩健:

如果您的應用程序執行相同TimeZone如在數據庫的默認,你也許可以用下面的閃避:

如果你跳過此步驟:

Date t = new Date(time.getTime()); 

,並直接使用java.sql.Time值,如:

newDate = new Date(newDate.getTime() + time.getTime()); 

轉換到將不會引入默認的TimeZone - java.sql.Time應包含存儲的值。

因人而異,買者自負,等...

相關問題