在数据库中保存基于日期或时间的数据的正确方法是什么?
java到postgresql(或其他数据库)的正确“字段映射”是什么?
该数据应以不带时区的utc格式存储。
->时间戳和基于日期的东西在这里失败,它们将添加当前时区(http://docs.oracle.com/javase/7/docs/api/java/util/Date.html)
->还有其他的选择吗?
我是否应该使用“纯纪元/整数”列和其他列作为时区?但是我不能使用数据库提供给我的所有功能等。
我可以使用hibernate和一些jodatime魔术,但在我当前的堆栈中,我没有使用hibernate。
可能的解决方案:
1)。更改UCT中的计算机/java时区->java(例如export TZ=“GMT”或-Duser.timezone=UCT)
(第二章)。在日期/时间字段/类型->中使用epoch/Integer/Long值,但现在我不能使用内置数据库函数。
(第三章)。对自定义hibernate数据类型使用Jodatime?
(四)。使用Java8新的时间和日期API?
最佳答案
在大多数情况下,在处理多个时区或希望将所有时间戳保存为UTC时,最好使用Postgres数据类型timestamptz
(简称timestamp with time zone
)。
别让这个名字误导你,时区实际上并没有被保存。但是(与timestamp [without time zone]
相反),将文本输入的时区作为修饰符来计算实际的UTC时间戳值,并将其保存下来。
在输出时,值的文本表示形式将根据当前时区设置进行格式化:时间戳将移动并附加相应的时区修饰符。
请注意,没有附加时区的时间戳将根据会话的当前时区设置进行解释。如果要输入不考虑当前时区的文字UTC值,它必须是:
'2014-08-21 16:39:09+0'::timestamptz
不是:
'2014-08-21 16:39:09'::timestamptz -- would assume current time zone
相关答案中的详细说明:
Ignoring timezones altogether in Rails and PostgreSQL