1

我在使用 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),因此时间戳(从 GMT 计算)偏移了 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 实体在哪里,并getDataTs()返回 java.util.Date 对象。字符串原来是"Tue Jun 30 23:59:56 BRT 2009>>>1246417196000"

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

4

3 回答 3

3

如前所述,日期和时间戳没有时区考虑。看来问题是因为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()

于 2012-06-05T12:51:15.103 回答
1

你的日期是6/30/2009-23:59:56。我是在 2009 年 6 月 30 日 23:59:56 读到的。所以解析它的格式应该是M/d/yyyy-HH:mm:ssor M/d/yyyy-kk:mm:ss(取决于你的时间是从 1 到 24 还是从 0 到 23)。但绝对不是d/M/yyyy-k:m:s:这个月在一天之前。

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

于 2012-06-01T22:43:59.027 回答
0

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

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

一般来说,Calendar 应该在 Java 中使用,而不是 java.util.Date,后者在很大程度上已被弃用。日历也有一个时区,所以你可能会遇到类似的问题。

于 2012-06-04T14:25:23.847 回答