JPA 日期和时间区域混淆



我在使用 JPA 从数据库中读取日期时遇到问题。我正在使用EclipseLink和PostgreSQL

我从CSV文件填充了我的数据库,女巫将日期作为字符串(格式为:6/30/2009-23:59:56)。我使用以下狙击将其转换为 Date 对象:

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),因此时间戳(根据格林威治标准时间计算)是 3 小时偏移。绘制后,时间戳将变为指向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 Entity,getDataTs()返回一个 java.util.Date 对象。字符串原来是"Tue Jun 30 23:59:56 BRT 2009>>>1246417196000"

如何告诉 JPA 不要转换从数据库中读取的时间戳?

如前所述,日期和时间戳没有时区考虑因素。似乎导致此问题是因为 Java 认为它从数据库中读取的时间是当前默认时区。

因此,如果数据库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()

您的日期是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:月份在一天之前。

此外,时间戳没有任何时区。这是一个普遍的时刻。只有当您显示其值时,时区才很重要,因为这样您就必须选择使用哪个时区来显示时间。使用设置了适当时区的日期格式来显示时间戳。

您的问题似乎是您将时间戳(没有时区)存储到 java.util.Date(具有时区偏移量)中。

如果您想控制时区的设置方式,请将时间戳存储为 java.sql.Timestamp,或使用您自己的@Converter。

一般来说,Calendar应该在Java中使用,而不是java.util.Date,后者大部分已被弃用。 日历也有时区,因此您可能会遇到类似的问题。

相关内容

  • 没有找到相关文章

最新更新