看起来(也许我是错的)如果你想保留 JDBC 和 Postgres 发生问题时的时区,你需要将时区与时间戳分开存储。
也就是说我更愿意给我的 ORM/JDBC/JPA 一个 JavaCalendar
(或乔达DataTime
)与说时区America/New_York
到 Postgrestimestampz
场地。而且我希望在检索时,无论服务器时区(或默认为 UTC)如何,都会给我返回一个Calendar
与时区America/New_York
。但只要看看大多数 JDBC 代码(以及依赖它的事情就不会发生)。
它是否正确?
当 postgres 支持时,我需要将 tz 存储在另一个字段中,这似乎很荒谬。
因此,似乎唯一的两个选择是:
- 选择
timestampz
Postgres 列作为java.util.String
并解析它。
- 将时区存储为单独的字段。
选项一和二一将需要某种类型的转换拦截器来用于我的 SQL 映射/ORM 库。
- JDBC 的最佳解决方案是什么?
- JPA 的最佳解决方案是什么(如果与 JDBC 不同)?
当您存储一个timestamp with time zone
(timestamptz
) 它被转换为 UTC 以存储在数据库中。检索时,它会转换为客户端当前的时区,而不是它原来所在的时区。基本上,它是一个时间点。
还有timestamp without time zone
(timestamp
)。这不受转换影响,但会not带有时间戳。如果您存储一个timestamp
将您的客户端时区设置为 UTC,然后在客户端时区为“+08:00”时检索它,您会得到相同的值。这就是您想要的一半,因为它保留了原始时间价值。
这些名称和行为非常糟糕且令人困惑,但它们是由 SQL 标准设置的。
如果您希望记录特定时区的时间点,则必须单独存储时区。我建议将其存储为INTERVAL
with a CHECK
约束将其限制为colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
。该定义拒绝 -12:00 并接受 +12:00;我不完全确定这是正确的,所以检查一下。
您可以存储timestamp
那个时区的当地时间(我可能会做的),或者存储timestamptz
事件发生时的 UTC 时间加上可让您将其转换为本地时间的偏移量。
对于 JDBC 来说,两者都可以正常工作。对于 JPA,这取决于您的提供商对间隔类型的理解和映射程度。理想情况下,您希望实体中有一个瞬态生成的字段,该字段可以使用以下方法重建您想要的日历实例:timestamp
and interval
存储在数据库中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)