java - Postgresql 日期类型和 java SimpleDateFormat

标签 java hibernate postgresql date simpledateformat

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

2014-05-01

然后我有以下 hibernate 映射:

@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 小时会导致日期及时移回至前一天?

有什么方法可以阻止这种情况发生,我只想将其视为日期,没有时间成分!

最佳答案

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

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

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

如果您使用其他时区转换存储日期,则必须调整时区属性(例如“欧洲/伦敦”)。

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

关于java - Postgresql 日期类型和 java SimpleDateFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22868648/

相关文章:

java - 是否可以删除不需要的标签的文本节点

java - Java从File中读取一定数量的元素

Java android 右侧图标菜单

java - 简化和压缩数组上的多个编辑操作。 java

java - 使用 Hibernate 获取重复条目

.net - 使用 Npgsql 提供程序 (.NET) 执行 sql 文件

Hibernate:是否可以在二级缓存中保存 transient 字段?

Hibernate 不插入 DTYPE - 值为空

php - 使用 PostgreSQL 在 PHP 上为 IN/=ANY 子句参数化数组

postgresql - Postgres 跨多个磁盘分布数据