【发布时间】:2015-03-10 21:54:16
【问题描述】:
PostgreSQL 9.3 / postgresql-9.3-1100-jdbc41.jar
我有一个包含timestamp without time zone 类型列的表,这会生成具有适用的java.util.Timestamp 属性的对象。
在插入过程中,我看到的是 jOOQ 的绑定过程将 java.util.Timestamp 转换为具有本地时区偏移的日期。
例如,对于 unix 时间戳 1421109419(2015 年 1 月 13 日 00:36:59 GMT),该属性设置为 new Timestamp(1421109419 * 1000)。
从我看到的 jOOQ 记录器:
2015-01-13 14:14:31,482 DEBUG [http-bio-8002-exec-4] org.jooq.tools.LoggerListener#debug:255 - -> with bind values : insert into "foo"."bar" ("start_date") values (timestamp '2015-01-13 13:36:59.0') returning "foo"."bar"."id"
2015-01-13 14:14:31,483 TRACE [http-bio-8002-exec-4] org.jooq.impl.DefaultBinding#trace:179 - Binding variable 3 : 2015-01-13 13:36:59.0 (class java.sql.Timestamp)
果然记录中的值是“2015-01-13 13:36:59”。
该软件在 NZDT 的机器上运行,这解释了 +13 偏移量。
鉴于时间是在与时区无关的容器 (Timestamp) 中提供的,我希望在创建插入语句时能够遵守这一规定。
我如何让 jOOQ 创建不在本地时间的时间戳?
【问题讨论】:
-
那么你的域模型直接定义了
Timestamp字段?所以它没有通过 jOOQ 转换器jooq.org/doc/3.5/manual/sql-execution/fetching/… ? -
正确 -
java.util.Timestamp是 jOOQ 生成的,也是我填充的。没有中间转换器。 -
我看到一些对 PostgreSQL 驱动程序的引用是造成这种情况的原因。如果是这种情况,我可以利用 jOOQ 中的任何方法将时间戳作为 epoch 值的函数,例如
TIMESTAMP WITHOUT TIME ZONE 'epoch' + 1421109419 * INTERVAL '1 second'? -
我不确定此信息是否适用于您的情况,但在我的情况下,我尝试使用
between( date1, date2 );无论两个日期对象在哪个时区,查询总是将它们转换为本地时间。我可以使用between( date1.toString(), date2.toString() )绕过它,两个日期对象都在UTC。
标签: postgresql jdbc timezone timestamp jooq