我使用了一个新的Date()对象来填充MySQL DB中的字段,但是该字段中存储的实际值是在我的本地时区.
如何配置MySQL以将其存储在UTC/GMT时区?
我认为,配置连接字符串会有所帮助,但我不知道如何.连接字符串中有许多属性,如useTimezone,serverTimzone,useGmtMillisForDatetimes,useLegacyDatetimeCode,...
简短的回答是:
将"default-time-zone = utc"添加到my.cnf
在您的代码中,除了为您的用户显示日期外,始终以UTC"思考"
使用JDBC获取/设置日期或时间戳时,请始终使用Calendar参数,设置为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")));
如果不这样做,则假定时间戳位于本地TimeZone中,而不是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();
希望这可以帮助!:-)