【发布时间】:2014-02-19 17:50:57
【问题描述】:
我的表有一个数据类型为带时区的时间戳的列。数据库中的值类似于
-
26-NOV-01 12.00.00.000000000 PM -07:00 - 或
26-NOV-01 12.00.00.000000000 PM -08:00
我有一个在 UTC 时区运行的 tomcat 服务器。我知道如何比较具有相同时区的两个日期,但我无法确定是否可以将服务器时间与具有-7.00、-8.00 或+5:30 等时区详细信息的数据库时间进行比较。
java中有没有办法将时间从数据库转换为公共时区,然后与另一个时间进行比较?
【问题讨论】:
-
看看 Joda DateTime。它对所有日期时间问题都非常强大。 joda.org/joda-time
-
嗯,你如何读取 db 值? JDBC 不支持 sql-columntype TIMESTAMP WITH TIMEZONE,至少在 Java 8 之前不支持。类 java.sql.Timestamp 仅与 TIMESTAMP WITHOUT TIMEZONE 兼容。
-
@dognose JodaTime 很好,但不能在这里施展魔法,而且有其自身的局限性。
-
@MenoHochschild 我对您的 WITH TIMEZONE 与 WITHOUT TIMEZONE 的说法感到困惑。两种类型都存储相同的值,都没有时区信息(名称“WITH TIMEZONE”有点用词不当)。不同之处在于它们如何处理包含时区信息的输入,其中“WITHOUT TIMEZONE”表示在解析期间忽略任何指定的时区指示符,并且假定日期时间已经采用 UTC。 “WITH TIMEZONE”表示注意输入 tz 并执行对 UTC 的调整。所以这两种类型在 JDBC 和 java.sql.Timestamp 方面的行为应该相同。
-
@BasilBourque 嗨,我的语句与 ANSI-SQL 有关。 JDBC 只能将可用的 SQL 映射到 Java,实际上不支持 SQL 选项“WITH TIMEZONE”。映射为:java.sql.Date DATE,java.sql.Timestamp TIMESTAMP WITHOUT TIMEZONE,java.sql.Time TIME WITHOUT TIMEZONE。 SQL 标记为 TIMEZONE 是 Java 的常见理解,而不是偏移量。 Java 8 将使用 OffsetTime 和 OffsetDateTime 提供新的数据库映射。 JodaTime 不提供这两种新类型。