2012-06-01 67 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

那么,回到零地? –