【发布时间】:2014-08-21 07:46:17
【问题描述】:
在数据库中保存基于日期或时间的数据的正确方法是什么? java到postgresql(或其他数据库)的正确“字段映射”是什么?
该数据应以没有时区的 utc 格式存储。
-> 基于时间戳和日期的东西在这里失败,它们将添加当前时区 (http://docs.oracle.com/javase/7/docs/api/java/util/Date.html)
-> 其他选项是什么?
我应该使用“plain epoch/integer”列和其他列作为时区吗?但是我无法使用数据库为我提供的所有功能等。
我可以通过一些 jodatime 魔法来使用休眠,但在我当前的堆栈中,我没有使用休眠。
可能的解决方案:
1)。更改计算机/java 时区 -> Java 将在 UCT 中(例如 export TZ="GMT" 或 -Duser.timezone=UCT)
2)。在日期/时间字段/类型中使用 epoch/Integer/Long 值 -> 有效,但现在我无法使用内置数据库函数。
3)。将 Jodatime 与自定义休眠数据类型一起使用?
4)。使用 Java8 新的时间和日期 API?
【问题讨论】:
-
Java 中的日期没有时区。一旦您将其格式化为字符串(或转换为 java.util.Calendar),它就只有一个时区。日期只是一个很长的包装(自纪元以来的毫秒数,1970 年 1 月 1 日,格林威治标准时间 00:00:00)。
-
如果您将日期保存/保存到数据库中,它将转换为时间+时区
-
Postgres 确实支持
timestamp without time zone。你试过吗?我认为在这种情况下,当您将其读入java.sql.Timestamp时不会发生任何转换(但我不完全确定) -
这是一个java问题,数据库没有问题:)
标签: java postgresql date time persist