java - 如何将 java.util.Date 存储到 UTC/GMT 时区的 MySQL 时间戳字段中?

标签 java mysql

我使用了一个新的 Date() 对象来填充 MySQL 数据库中的一个字段,但存储在该字段中的实际值是在我的本地时区中。

如何配置 MySQL 以将其存储在 UTC/GMT 时区?

我认为配置连接字符串会有所帮助,但我不知道如何做。连接字符串中有许多属性,如 useTimezone、serverTimzone、useGmtMillisForDatetimes、useLegacyDatetimeCode、...

最佳答案

简短的回答是:

  • 在 my.cnf 中添加 "default-time-zone=utc"
  • 在您的代码中,始终“思考”UTC,除非为您的用户显示日期
  • 使用 JDBC 获取/设置日期或时间戳时,始终使用日历参数,设置为 UTC:

    resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

  • 要么将您的服务器与 NTP 同步,要么仅依靠数据库服务器告诉您现在几点。

长答案是这样的:

在处理任何数据库和任何客户端代码中的日期和时区时,我通常推荐以下策略:

  1. 将您的数据库配置为使用 UTC 时区,而不是使用服务器的本地时区(当然除非是 UTC)。

    • 如何操作取决于您的数据库服务器。可以在此处找到 MySQL 的说明:http://dev.mysql.com/doc/refman/5.0/en/time-zone-support.html .基本上你需要在 my.cnf 中这样写:default-time-zone=utc

    • 通过这种方式,您可以在任何地方托管您的数据库服务器,轻松更改您的托管位置,并且更普遍地在您的服务器上操作日期而不会产生任何歧义。

    • 如果您真的更喜欢使用本地时区,我建议至少关闭夏令时,因为数据库中的日期不明确可能是一场真正的噩梦。
      • 例如,如果您正在构建电话服务并且在数据库服务器上使用夏令时,那么您就是在自找麻烦:无法判断客户是否从“2008- 10-26 02:30:00”到“2008-10-26 02:35:00”实际上调用了 5 分钟或 1 小时 5 分钟(假设夏令时发生在 10 月 26 日凌晨 3 点)!
  2. 在您的应用程序代码中,始终使用 UTC 日期,向用户显示日期时除外。

    • 在 Java 中,当从数据库读取时,总是使用:

    时间戳 myDate = resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

    • 如果您不这样做,时间戳将被假定为您本地的时区,而不是 UTC。
  3. 同步您的服务器或仅依赖数据库服务器的时间

    • 如果您的 Web 服务器位于一台(或多台)服务器上,而您的数据库服务器位于其他服务器上,那么我强烈建议您将它们的时钟与 NTP 同步。

    • 或者,仅依靠一台服务器告诉您现在几点。通常,数据库服务器是最好的请求时间的服务器。换句话说,避免这样的代码:

    preparedStatement = connection.prepareStatement("UPDATE my_table SET my_time = ? WHERE [...]");
    java.util.Date now = new java.util.Date();//本地时间! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int result = preparedStatement.execute();

    • 相反,依赖于数据库服务器的时间:

    preparedStatement = connection.prepareStatement("UPDATE my_table SET my_time = NOW() WHERE [...]");
    int result = preparedStatement.execute();

希望对您有所帮助! :-)

关于java - 如何将 java.util.Date 存储到 UTC/GMT 时区的 MySQL 时间戳字段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309203/

相关文章:

php - MySQL PHP : how to efficiently fetch previous X dates that include entries

javascript - MySQL 表更改的事件监听器?

javadoc : error - invalid flag: -Xdoclint:none, 当我使用 java 7 时,它在 java 8 中有效

java - 我试图从字符串中删除奇怪的字符(请检查下面的程序)我收到一个异常

java - 如何在 Java 中使用泛型创建静态 'Object Holder' 类

php - MySQL需要子选择或临时表

mysql - 我正在为连接查询而苦苦挣扎。我想显示给定日期的 first_check_in 和 last_check_out?

java - JPA:数据库生成的列

java - 初始化对象类型数组

Python连接mysql错误: unexpected indent