【问题标题】:Query a mysql DATETIME with a given timezone in Java在Java中使用给定时区查询mysql DATETIME
【发布时间】:2012-02-21 19:15:58
【问题描述】:

我正在尝试从 Java 中查询一个 mysql DATETIME。我知道服务器的时区,但我无法按照我的预期将日期时间与时区拉出。

ResultSet rs = st.executeQuery(...);

Date d1=rs.getTime(i, Calendar.getInstance(TimeZone.getTimeZone("UTC")));
Date d2=rs.getTime(i, Calendar.getInstance(TimeZone.getTimeZone("PST")));

System.out.println("d1: "+d1.getTime());
System.out.println("d2: "+d2.getTime());

这给我留下了:

d1: 40258000
d2: 40258000

我在这里缺少一些基本的东西吗?

ResultSet.getDate() 确实考虑了日历。但我不能使用它,因为它会截断时间信息。仍然很奇怪ResultSet.getTime() 不会处理任何时区转换。

【问题讨论】:

  • 您知道Date.getTime() 始终显示在格林威治标准时间吗?
  • ResultSet.getTime() 还是 Date.getTime()?我知道 Date.getTime() 被拉到 UTC。
  • @user833970 好吧,正如 Jon Skeet 指出的那样,如果数据库不存储时区信息,ResultSet.getTime() 实际上会考虑时区(根据文档)。我的猜测是您的数据库确实存储了所述信息,因为显然它没有在您的示例中考虑日历:/
  • 那么为什么要在 ResultSet.getDate() 中考虑日历呢?我认为这可能是连接器的错误(我使用的是 mysql-connector-java-5.1.18-bin.jar)。
  • 我可怕的最终解决方案是更改系统时区以匹配 mysql 服务器时区。上帝怜悯我们所有人。

标签: java mysql date


【解决方案1】:

documentation 声明:

如果底层数据库不存储时区信息,此方法使用给定的日历构造适当的毫秒值。

那么也许数据库在这种情况下存储时区信息?

你在数据库中的值是什么样的,它应该代表什么?

【讨论】:

    【解决方案2】:

    另一种方法是让 MySQL 服务器转换时区:

    SELECT CONVERT_TZ(timefield,'PST','UTC') AS tf
    

    例如,将 timefield 字段中的 DATETIME 值从 PST 转换为 UTC 时间(然后将其返回为 tf)。

    【讨论】:

      【解决方案3】:

      Date类上的getTime根据http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html返回纪元时间 所以它会调整你的时区。我认为该页面意味着您应该使用时区调整日历来获取您的当地时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-15
        • 2013-10-06
        • 2012-10-23
        • 1970-01-01
        • 2012-02-06
        • 2011-11-06
        • 1970-01-01
        相关资源
        最近更新 更多