【问题标题】:Date is changed after persist in database?在数据库中持久化后更改日期?
【发布时间】:2014-05-04 07:06:00
【问题描述】:

用户从JSP页面输入日期,转换为JodaDateTime,输出字符串为

2014-03-26T00:00:00.000+09:00

但是,当我将这个包含日期的实体保存在数据库中,并再次检索并打印出来时,它变成了

2014-03-25T09:00:00.000+09:00.

我不知道为什么数据库将此更改为减去一天。 我使用 postgres、hibernate JPA 进行应用程序开发。 提前致谢。

【问题讨论】:

  • 您确定数据库中的时区仍为+09:00 吗?看起来它把时间调整到了不同的时区,这将是相同的时间,只是用不同的时区表示

标签: java hibernate postgresql jpa jodatime


【解决方案1】:

数据库中的值是什么?使用 pgAdmin app、psql 命令行工具或其他一些数据库管理工具直接查询 Postgres。

您在 Postgres 中使用什么数据类型?您可能应该使用 TIMESTAMP WITH TIME ZONE。避免使用 WITHOUT time zone 类型,因为它忽略您可能提供的任何时区偏移信息。

尽管有名称,但这两种类型都不存储任何时区信息。不同之处在于您是否希望 Postgres 关注传入数据的时区信息。请务必通读 the doc 并使用它进行实验,直到了解日期时间的工作原理。

阅读 Postgres 专家 David E. Wheeler 的 Always Use TIMESTAMP WITH TIME ZONE

【讨论】:

  • 从 psql 命令行工具,日期值为“2014-03-25”,我使用日期作为数据类型,所以如你所说,它忽略了时区偏移。现在我将尝试阅读该文档,将时区信息添加到日期列。希望它能解决这个问题。
  • @user2321728 你的意思是date 类型吗?那没有时间,那么您如何检索问题中引用的日期时间值?如果您希望我们提供帮助,请用您的语言准确。此外,这是一篇由 Postgres 专家撰写的有用文章,Always Use TIMESTAMP WITH TIME ZONE David E. Wheeler。
  • 对于数据库,我使用日期类型,而对于映射实体类,我使用 Joda DateTime 类型。该应用程序只需要日期信息,时间不是必需的,时区也不是。直到我发现检索到错误的日期...也许一个简单的解决方案是使用字符串而不是日期类型。
  • @user2321728 或者,您可以阅读文档、搜索 StackOverflow 和谷歌,而不是四处乱猜不同的类和数据类型,花点时间学习和学习。然后,您会发现 Joda-Time 为仅日期无时间和无时区提供了 LocalDate 类。您会发现 Java 提供了 java.sql.Date 字段来匹配 SQL DATE 类型。而且您会了解到,如果您的软件有可能必须处理当地城镇以外的实体或事件,那么忽略时间和时区并不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多