当前位置: 首页 > 知识库问答 >
问题:

我应该将时区与Postgres和JDBC的时间戳分开存储吗?

沃皓轩
2023-03-14

看起来(也许我错了),如果您想要保留JDBC和Postgres发生的事情的时区,您需要将时区与时间戳分开存储。

也就是说,我更愿意给我的ORM/JDBC/JPA一个Java日历(或Jodadatatime),其中包括时间区域America/New_York到Postgrestimestampz字段。我希望在检索时,不管服务器的时区(或默认为UTC)如何,都能返回一个日历,时区为America/New_York。但只需看看大多数JDBC代码(以及依赖于它的事情不会发生)。

这是正确的吗?

当postgres支持tz时,我需要将tz存储在另一个字段中,这似乎很荒谬。

因此,似乎只有两种选择:

  1. 选择timestampzPostgres列作为java.util.String并解析它。
  2. 将时区存储为单独的字段。

第一个选项和第二个选项需要为我的SQL mapping/ORM库提供某种类型的转换拦截器。

  • 什么是JDBC的最佳解决方案?
  • JPA(如果不同于JDBC)的最佳解决方案是什么?

共有2个答案

史修谨
2023-03-14

EclipseLink支持将时区存储在Oracle中,我认为如果您定制了PostgreSQL平台,也可以将时区存储在Postgres中。

淳于枫
2023-03-14

当使用时区存储时间戳(timestamptz)时,它会转换为UTC存储在DB中。检索时,它将转换为客户端的当前时区,而不是它最初所在的时区。基本上是个时间点。

还有不带时区的时间戳(时间戳)。这不需要转换,但不带有时间戳。如果您存储的timestamp的客户端时区设置为UTC,然后在客户端时区为'+08:00'时检索它,则会得到相同的值。这是您想要的一半,因为它保留了原始时间值。

名称和行为是可怕和混乱的,但由SQL标准设置。

如果希望记录特定时区的时间点,则必须单独存储时区。我建议将其存储为INTERVAL,并使用check约束将其限制为间隔“-12”小时+间隔“1”秒和间隔“12”小时之间的colname。该定义拒绝-12:00,接受+12:00;我不是很确定这是对的,所以检查一下。

您可以在该时区存储本地时间的timestamp(我可能会这样做),或者存储事件发生时的UTC时间的timestamptz以及允许您将其转换为本地时间的偏移量。

对于JDBC两者都可以很好地工作。对于JPA,这将取决于您的提供者理解和映射间隔类型的程度。理想情况下,您希望实体中有一个瞬时生成的字段,该字段使用数据库中存储的timestampinterval重建您想要的日历实例。

 类似资料:
  • 我不太理解时间戳的用法, 例如 用户创建文章,他们可以选择,系统也会自动存储。 a.我是否应该使和具有时区并设置UTC的时间戳? b.用户post字符串,然后将其转换为utc时间戳,如下所示使用并存储,当某人选择这一行时,将其显示为用户客户端时间反向使用 c.我使用到,是不是意味着服务器时间?我做得对吗? 我的想法是,我总是在数据库中插入utc时区时间戳,无论用户/客户端读取的地方,都将数据转换为

  • 问题内容: 我有下面的简单表: 我想了平均,并且每一天为6个小时桶。例如00:00至06:00、06:00至12:00、12:00至18:00和18:00至00:00。 我可以使用以下查询按年,月,日和小时分组: 但是我无法将每天分为上述4个时段,非常欢迎您提供任何帮助。 问题答案: 我认为将(商的小时数/ 6)的商的整数值分组应该会有所帮助。试试看,看看是否有帮助。您的分组依据应该是 其背后的逻

  • 假设我有一个时间戳值。 编辑 现在我正在使用获取上述时间的毫秒值; 根据Java文档,getTime()方法的定义是

  • 问题内容: 如何配置JPA /hibernate模式以UTC(GMT)时区在数据库中存储日期/时间?考虑以下带注释的JPA实体: 如果日期为太平洋标准时间(PST)2008-Feb-03 9:30 am,那么我希望数据库中存储2008-Feb-03 5:30 pm的UTC时间。同样,从数据库中检索日期时,我希望将其解释为UTC。因此,在这种情况下530pm是UTC 530pm。显示时,它将被格式化

  • 问题内容: 我使用了一个新的Date()对象来填充MySQL DB中的一个字段,但是存储在该字段中的实际值在我的本地时区中。 如何配置MySQL以将其存储在UTC / GMT时区? 我认为,配置连接字符串会有所帮助,但我不知道如何。连接字符串中有许多属性,例如useTimezone,serverTimzone,useGmtMillisForDatetimes,useLegacyDatetimeCo

  • 问题内容: 如何配置JPA /hibernate模式以UTC(GMT)时区在数据库中存储日期/时间?考虑以下带注释的JPA实体: 如果日期是太平洋标准时间(PST)2018-Feb-03 9:30 am,那么我希望数据库中存储2008-Feb-03 5:30 pm的UTC时间。同样,从数据库中检索日期时,我希望将其解释为UTC。因此,在这种情况下,530pm是UTC 530pm。显示时,它将被格式