【问题标题】:Can JDBC + MySQL be convinced to ignore timezones?可以说服 JDBC + MySQL 忽略时区吗?
【发布时间】:2011-03-01 20:39:11
【问题描述】:

我有一个 Java Web 应用程序,其中客户端将时间戳数据发送到服务器以存储在 MySQL 数据库中并稍后检索。这些时间戳应始终被视为本地时间,并且永远不会针对时区进行调整:如果一个时区的客户端输入 18:00:00 的时间,则它应该为另一个时区的客户端显示为 18:00:00。

保存此值的数据库列是 DATETIME 类型,因为我的印象是它不进行时区调整。 java 应用程序接收时间戳作为 java.util.Date 对象,并在将它们插入 PreparedStatements 之前将它们转换为 java.sql.Timestamp 对象。然而,在此过程中,当客户端和服务器位于不同的时区时,时间值会发生偏移。

为了让您了解我在寻找什么,我可以将所有时间戳存储为字符串,这正是我想要的效果,但对我来说必须格式化和解析字符串没有意义作为需要对其进行操作的日期。

当时间戳值应始终视为本地时间时,处理此类应用程序的常用方法是什么?

【问题讨论】:

    标签: java mysql jdbc timezone


    【解决方案1】:

    这是一个非常古老的线程,但我发现如果您使用数据库的时区插入和/或获取Date,它将在任何地方工作:

    final Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT+2"));
    pst.setDate(0, new java.sql.Date(myDate.getTime()), cal);
    (...)
    resultSet.getDate("COLUMN_NAME", cal).getTime());
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您应该能够在读取和写入数据库时​​通过使用采用Calendar 对象的 setTimestamp 和 getTimestamp 方法来强制使用特定的 TimeZone。

      【讨论】:

        【解决方案3】:

        这是一个旧线程,但没有人发布一个简单的答案。请改用 TIMESTAMP 字段。 MySql 不会为 TIMESTAMP 进行时区调整,因此它可以为您开箱即用。

        大多数类似的线程都在尝试解决这种缺乏调整的问题,但对于您的情况,它可以很好地满足您需要的行为。

        【讨论】:

          【解决方案4】:

          将 Web 应用程序服务器和数据库服务器都配置为使用 GMT/UTC 时区。归结为整个代码库和所有层应该使用同一个时区。

          相关:

          【讨论】:

            【解决方案5】:

            问题在于java.util.Date 代表一个“时间点”,而不是像 18:00 这样的时间。 (在这种情况下,时间点是通过自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数来衡量的,但原则上这并不重要。)

            通常的方式(至少,我一直这样做的方式)是在数据库中存储时间点,所以如果你在下午 1 点做某事,我认为它是例如下午 3 点,因为那是我所在时区的同一时间点。因此,存储“时间”(HH:MM)而不存储“时间点”的要求,即不调整收件人的时区,是非常不寻常的,至少在我的经验中是这样。

            我将使用您正在使用的DATETIME 数据类型,但将值作为来自Java 的字符串插入和读取,即使用PreparedStatement 上的setString 方法和ResultSet 上的getString 方法。

            【讨论】:

              【解决方案6】:

              我要做的是将时间戳存储为 long,代表 GMT 时间 - 这样,MySQL 就无法搞砸它(作为奖励,您将获得更好的精度 - MySQL 时间戳是仅精确到一秒)。添加一个单独的列来存储时区,然后将其转换为本地时间字符串,然后再显示给用户。

              另外,请注意夏令时。有些地方没有它,而且它并不总是在所有有它的地方同时开始和停止。

              【讨论】:

                【解决方案7】:

                MySQL 或任何其他标准数据库不存储时区信息。它只存储与 Epoch 的时间偏移量。由客户决定特定时区的时间。

                然而,在此过程中,当客户端和服务器位于不同的时区时,时间值会发生偏移。

                当然,它应该是这样工作的。如果您想强制使用强制时区,您可以在将时间戳发送到 mysql 数据库实例之前应用您想要的时区偏移量(您应该使用标准库,例如可怕的内置 jdk 或 joda time 来代替只是增加或减少 1 小时)。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-08-09
                  • 1970-01-01
                  • 2016-08-23
                  • 1970-01-01
                  • 2014-12-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多