我有一个具有日期字段的类,该日期字段表示一条数据的“有效起始日期”。定义如下:
@Temporal( TemporalType.DATE ) private Date validFrom;
从我从数据库中提取日期并显示它的那一点似乎一切正常。如果我在前端选择日期2003年9月18日,那么当我检查数据库时要保存足够的日期,即保存日期(数据库为MySQL 5.5.9列类型为DATE)。但是,当我调出列表记录时,显示的日期是2003年9月17日-提前一天。
如果我选择年初或晚于2003年3月26日或2003年12月25日这样的日期,那么一切都很好,所以我猜想这与夏令时有关,但是错误在哪里蔓延?由于数据库似乎保存了正确的日期,我猜想它一定是JPA转换回java.util.Date时的日期- java.util.Date是用于日期的最佳类吗?我已经看到了一些人们使用Calendar的示例,但是看起来很沉重,并且我不确定它是否可以与基于JSF的前端配合使用。
经过大量的实验和搜索,我很确定我已经找到了问题的原因。该日期保存在java.util.Date中,其中包含所有时间和时区。似乎JPA正在从数据库中读取日期2003年9月18日,然后像这样填充日期:“ Thu Sep 18 00:00:00 BST 2003”-请注意,时区已设置为BST,可能是因为它不是由数据库明确设置。无论如何,如果只想看这样的日期,则有必要在JSF页面中格式化输出:
<h:outputText value="#{t.validFrom}"> <f:convertDateTime pattern="dd MMM yyyy"/> </h:outputText>
但是,这假定时区是机器上当前有效的时区。在我的情况下,时区当前为格林尼治标准时间(因为它是冬天),因此当显示日期“ Bhu 2003 Thu Sep 18 00:00:00 BST”时,它将减去一小时将其转换为GMT,从而显示2003年9月17日。