我自己遇到了这个。我看到的是,即使您已在日期中将UTC指定为时区(并且可以通过打印出来并在末尾看到“ Z”来查看),但出于某种原因,JVM还是想接管并使用JVM的默认时区为您转换日期。
无论如何,您需要一个自定义映射来解决此问题。尝试使用 Jadira:
@Entity
@Table(name = "MY_TABLE")
public class MyTable implements Serializable {
. . .
@Column(name = "START_DATE")
@Type(type="org.jadira.usertype.dateandtime.legacyjdk.PersistentDate")
private Date startDate;
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
. . .
}
默认情况下,Jadira的PersistentDate
类在将日期转换为要存储在数据库中的毫秒值时,使用UTC作为时区。您可以指定其他时区,但听起来像是要存储UTC。
就像您的帖子中的注释所暗示的那样,有时您用来查询数据库的工具正在为您进行愚蠢的自动(基于我的JDK默认TZ的转换),使您相信该值仍然不正确。
您也可以尝试存储原始值(作为INTEGER),只是为了使自己确信已存储了正确的毫秒值。
HTH,
摩西