【问题标题】:Postgresql Date type and java SimpleDateFormatPostgresql 日期类型和 java SimpleDateFormat
【发布时间】:2014-05-17 02:41:53
【问题描述】:

我有一个日期类型的数据库列,具有以下值

2014-05-01

然后我有以下休眠映射:

@Temporal(TemporalType.DATE)
@Column(name = "end_date", nullable = false, length = 13)
public Date getEndDate() {
    return this.endDate;
}

public void setEndDate(Date endDate) {
    this.endDate = endDate;
}

当我通过以下方式在 JSF 页面中引用此日期时

<h:outputText value="#{someBean.endDate}">
    <f:convertDateTime pattern="d MMM yyyy" />
</h:outputText>

它读作

'30 Apr 2014'

所以我删除了 f:convertDateTime 并显示:

'5/1/2014'

然后我将 f:convertDateTime 更改为:

<h:outputText value="#{someBean.endDate}">
    <f:convertDateTime pattern="HH:mm d MMM yyyy" />
</h:outputText>

上面写着:

'23:00 30 Apr 2014'

所以我的猜测是我的计算机设置为 BST(英国夏令时),并且数据库中的日期以某种方式设置为 GMT(或祖鲁时间),因此 -1 小时会导致日期及时移回前一天?

有没有办法阻止这种情况发生,我只想把它当作一个日期,没有时间成分!

【问题讨论】:

标签: java hibernate postgresql date simpledateformat


【解决方案1】:

您也应该指定时区(为了安全起见,还应该指定英文区域):

<h:outputText value="#{someBean.endDate}">
    <f:convertDateTime pattern="d MMM yyyy" timeZone="GMT" locale="en" />
</h:outputText>

在此我假设输入位于 UTC 时区(即文字日期最初是相对于 UTC 存储的),因此使用相同的输出格式偏移量不会更改日期(以及您的中间输出“5/ 1/2014" 只是默认的美国格式,由相同的偏移效果更改)。

如果您使用另一个时区转换存储了您的日期,那么您必须调整时区属性(例如“欧洲/伦敦”)。

更新:我找到了这个SO-question,它也应该对你有所帮助。

【讨论】:

  • 太好了,是的。但是你能告诉我,如果日期在数据库中存储为“01/05/2014”,它如何知道它输入的时区?
  • @DaveB java.util.Date 类型的对象本身在其内部状态中没有时区。但是从应用层通过 jdbc 层到数据库的传输使用时区转换,因此可以更改相对于 UNIX 纪元的存储毫秒数。
  • 谢谢,是的,这是有道理的,链接的问题也帮助了我
  • @MenoHochschild 不,输入不是 UTC。 Postgres 列的数据类型是DATE。根据SQL-92 specPostgres DATE仅代表日期(年、月、日)没有时间部分。这里的核心问题是从数据库中仅检索日期,然后用于创建一个 java.util.Date 对象,该对象包括时间和日期。在此过程中创建了一个时间部分,大概是 00:00:00 时区(UTC?)。
  • @BasilBourque 是的,类似的。顺便说一句,Postgre-SQL 表现出比 Oracle 更好的符合标准的行为。
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多