2012-06-01 74 views
1

我在使用JPA從數據庫讀取日期時遇到問題。我正在使用EclipseLink和PostgreSQLJPA日期和時區混淆

我已經從一個CSV文件填充我的數據庫,女巫的日期爲字符串(格式爲:6/30/2009-23:59:56)。我用下面snipet將其轉換爲一個日期對象:如預期

public static Date parseDate(String s){ 
    DateFormat formatter = new SimpleDateFormat("d/M/yyyy-k:m:s"); 
    try { 
     return new Date(((java.util.Date)formatter.parse(s)).getTime()); 
    } catch (ParseException ex) { 
     Logger.getLogger(Type.class.getName()).log(Level.SEVERE, null, ex); 
     return null; 
    } 
} 

日期被正確地轉換並存儲在數據庫中。這裏是我的Date對象映射到數據庫:

@Column(name="data_ts", nullable=false) 
@Temporal(TemporalType.TIMESTAMP) 
private Date dataTs; 

這個問題似乎發生時,我嘗試從數據庫中讀取日期的圖表(Highcharts)中使用它。與相同的時間戳記錄上面得到讀爲:

Mon Jun 06 23:59:56 BRT 2011和它的時間戳1307415596000

請注意,這是在巴西時間(+ 3H),所以時間戳(即從GMT計算)爲3小時移動。一旦ploted,時間戳轉向指向07/06/2011 02:59:56

下面是一個例子:

List<TimedataEnt> timeData = currentWellsite.getTimeData(); 
String debug = timeData.get(timeData.size()-1).getDataTs().toString() + ">>>" + timeData.get(timeData.size()-1).getDataTs().getTime(); 

其中currentWellsite是和JPA實體,並getDataTs()返回一個java.util.Date對象。 該字符串原來是"Tue Jun 30 23:59:56 BRT 2009>>>1246417196000"

如何讓JPA不轉換從數據庫中讀取的時間戳?

回答

3

如前所述,日期和時間戳沒有時區考慮因素。看起來問題是由於Java認爲它從數據庫中讀取的時間是當前的默認時區而引起的。

因此,如果數據庫contais 2011-04-04 14:00:00和我目前的時區爲+3,將其分配給java Date將生成2011-04-04 14:00:00 BRT time(+3),時間戳移位3小時(因爲時間戳從UTC開始計算)。

通過獲取計算的時間戳解決該問題:

long ts = myDate().getTime() + TimeZone.getDefault().getRawOffset(); 

它說getRawOffset()不採取夏令時間考慮是非常重要的。爲此,請使用getOffset()

1

你的日期是6/30/2009-23:59:56。我讀到2009年6月30日23:59:56。因此,解析它的格式應該是M/d/yyyy-HH:mm:ssM/d/yyyy-kk:mm:ss(取決於您的小時數是從1到24還是從0到23)。但絕對不是d/M/yyyy-k:m:s:這個月是在一天前。

此外,時間戳沒有任何時區。這是一個普遍的瞬間。只有當您顯示時區的重要性時才顯示其值,因爲您必須選擇使用哪個時區來顯示時間。使用帶有適當時區的DateFormat來顯示您的時間戳。

+0

嗨。謝謝回答。聰明的做法確實是錯誤的(謝謝!),但問題仍然存在。正如我試圖澄清,我不顯示DateFormat的日期。我將它轉換爲時間戳,並在圖表上使用它。 –

+0

剛剛在原始問題中添加了一個示例。 –

0

你的問題似乎是你存儲你的Timestamp(沒有時區)到一個java.util.Date(它有一個時區偏移量)。

如果您想要控制如何設置時區,請將您的Timestamp存儲爲java.sql.Timestamp,或使用您自己的@Converter。

一般而言,日曆應該用於Java而不是java.util.Date,這在大多數情況下已被棄用。日曆還有一個時區,所以你可能有類似的問題。

+5

一個java.util.Date沒有TimeZone。而且這還遠遠不被棄用(不幸的是)。 BTW,Timestamp擴展java.util.Date。 –

+1

那麼,回到零地? –