我使用了一个新的Date()对象来填充MySQL DB中的字段,但是该字段中存储的实际值是在我的本地时区.
如何配置MySQL以将其存储在UTC/GMT时区?
我认为,配置连接字符串会有所帮助,但我不知道如何.连接字符串中有许多属性,如useTimezone,serverTimzone,useGmtMillisForDatetimes,useLegacyDatetimeCode,...
Min*_*ark 13
简短的回答是:
使用JDBC获取/设置日期或时间戳时,请始终使用Calendar参数,设置为UTC:
resultset.getTimestamp("my_date",Calendar.getInstance(TimeZone.getTimeZone("UTC")));
答案很长就是这样的:
在处理任何数据库中的日期和时区以及任何客户端代码时,我通常建议使用以下策略:
将数据库配置为使用UTC时区,而不是使用服务器的本地时区(当然,除非它是UTC).
如何操作取决于您的数据库服务器.有关MySQL的说明,请访问:http://dev.mysql.com/doc/refman/5.0/en/time-zone-support.html.基本上你需要在my.cnf中写这个:default-time-zone = utc
这样,您可以在任何地方托管数据库服务器,轻松更改托管位置,以及更一般地操作服务器上的日期而不会产生任何歧义.
在应用程序代码中,除了向用户显示日期外,始终使用UTC日期.
时间戳myDate = resultSet.getTimestamp("my_date",Calendar.getInstance(TimeZone.getTimeZone("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();
希望这可以帮助!:-)
| 归档时间: |
|
| 查看次数: |
20279 次 |
| 最近记录: |