java.util.Datevs java.sql.Date:何时使用哪个以及为什么?
我们正在讨论在postgres中存储时间戳的最佳方法.目前,所有时间戳都存储为+00,并且我们有与每个客户端关联的时区.我们查找时区并转换发生事件的时间,这会增加复杂性,因为我们需要进行更多连接和更复杂的查询.
另一种方法是连接到Postgres并设置连接的时区,它将所有时间都更改为该时区.
我的问题是在ANZ有4-5个时区.当我们尝试开发票时,我们需要知道某些交易发生的那一天,并且在三个时区之间没有完美的解决方案.
我想在时间戳中包含时区以使其更容易 - TIMESTAMP'1999-01-15 8:00:00 -8:00'
我觉得这是最好的做法,但有些人说这是个坏主意.我们将为ANZ的客户提供准确的发票,最佳解决方案和最优雅的解决方案?
干杯斯科特
似乎(也许我错了)如果你想保留JDBC和Postgres发生某些事情的时区,你需要将时区与时间戳分开存储.
那就是我更愿意给我的ORM/JDBC/JPA一个带有时区的Java Calendar(或Joda DataTime)America/New_York到Postgres timestampz字段.并且我希望无论服务器时区(或默认为UTC)检索都能给我带回Calendar时区America/New_York.但只是查看大多数JDBC代码(以及依赖于它的事情不会发生).
它是否正确?
当postgres支持时,我需要将tz存储在另一个字段中,这似乎很荒谬.
因此,似乎只有两个选项:
timestampzPostgres列作为a java.util.String并解析它.第一和第二选项需要某种转换拦截器用于我的SQL映射/ ORM库.
我对重新讨论这个过度讨论的话题犹豫不决,但我创建了一组表来存储数据,其中许多表包括一个名为“createdate”的字段,指定为“没有时区的时间戳”。代码库提供给这些的日期/时间值始终采用 UTC。UI 将能够控制向用户呈现数据的方式,因此某些设置将指示在 UI 中转换为时区。
其中一些时间戳将用于报告,以便为最终用户显示信息。其他时候,这些值将用于确定针对数据运行的夜间作业。
这是一个典型的多租户云托管系统,其客户端跨不同时区。服务器应该永远不会被移动,但我想改变托管区是一个非常遥远的可能性。它是在.net平台上编写的。不使用 noda 时间,只使用内置的 DateTime 内容(目前)。
文档非常清楚时区时间戳如何存储信息:https : //www.postgresql.org/docs/current/datatype-datetime.html
这个答案对两种主要时间戳数据类型的差异也有很好的背景:https : //stackoverflow.com/a/14616640/1905693
这个答案也有一些很好的信息,但面向 Java: 使用 Java 在 PostgreSQL 中存储时间的最推荐方法是什么?
Josh Berkus 有一篇过时的文章很有帮助:https ://it.toolbox.com/blogs/josh-berkus/zone-of-misunderstanding-092811
似乎其中大多数都推荐带时区的时间戳,但就我而言,没有时区的时间戳是否合适?
如果我确实想依靠 pg 进行转换,那么 AT TIME ZONE 子句可以吗?
从整体系统架构来看,依靠 UI 来改变呈现方式是一种常见且合理的方法吗?(是的,这个对于 SO 的格式来说可能过于主观了)