我使用了一个新的 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 同步,要么仅依靠数据库服务器告诉您现在几点。
长答案是这样的:
在处理任何数据库和任何客户端代码中的日期和时区时,我通常推荐以下策略:
将您的数据库配置为使用 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 点)!
在您的应用程序代码中,始终使用 UTC 日期,向用户显示日期时除外。
- 在 Java 中,当从数据库读取时,总是使用:
时间戳 myDate = resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- 如果您不这样做,时间戳将被假定为您本地的时区,而不是 UTC。
同步您的服务器或仅依赖数据库服务器的时间
如果您的 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/