【问题标题】:Java compare time with timezoneJava比较时间和时区
【发布时间】: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 不提供这两种新类型。

标签: java date time timezone


【解决方案1】:

您可以使用joda-time 方便地将您的偏移量和日期解析为公共时间(例如 UTC)。

以您帖子中提到的 2 个时间实例为例:

String time1 = "26-NOV-01 12.00.00.000000000 PM -07:00";
String time2 = "26-NOV-01 12.00.00.000000000 PM -08:00";
DateTimeFormatter parser = DateTimeFormat.forPattern("dd-MMM-yy hh.mm.ss.SSSSSSSSS aa Z").withZoneUTC(); // joda time date time formatter instance with a common UTC timezone

System.out.println(parser.parseDateTime(time1)); // parse to date time - gives: 2001-11-26T19:00:00.000Z
System.out.println(parser.parseDateTime(time2)); // parse to date time - gives: 2001-11-26T20:00:00.000Z

System.out.println(parser.parseDateTime(time2).compareTo(parser.parseDateTime(time1))); // Comparing both the times here - gives: 1

在这里,您可以比较具有不同偏移量的 2 次,并将它们标准化为一个共同的时区。同样,您可以选择自己喜欢的时区并方便地处理这些时间实例。

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2017-11-04
    • 2021-12-06
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多