处理MySQL中的多个时区

时间:2014-04-27 16:03:02

标签: mysql optimization timezone

我正在为我的应用程序使用 MySQL 数据库。我正在使用 Java(使用Spring)进行Web开发,使用 Apache Tomcat 进行Application Server。在我的应用程序中,有多个用户具有不同的时区。现在假设我正在计算用户的总登录时间。

我正在为必要的DDL和DML查询提供SQL Fiddle链接here。在那里,我还为每个用户编写了计数总登录时间的选择查询。因为userIds 3和4的用户还没有登录,所以我使用NOW()来计算总登录时间。但它们来自不同的时区。我将所有时间都存储在MYSQL中 GMT-0 。那么它会给我错误的userId 3和4的记录时间吗?如果错了,它的解决方案是什么?

2 个答案:

答案 0 :(得分:4)

  

那么它会给我错误的userId 3和4的记录时间吗?如果错了,它的解决方案是什么?

如果您实际使用GMT + 0记录该值,则不会给您错误的答案。无论当地时间对用户来说无关紧要 - 您感兴趣的只是登录和退出之间经过了多长时间。

事实上,使用用户的本地时区会更加困难 - 您最终不得不考虑夏令时。例如,假设您在2014年10月26日记录了我的交互。我可能有一个本地登录时间为凌晨1:45,本地注销时间为凌晨1:05,这听起来很乱 - 直到你意识到登录时间是夏令时生效的时候。如果您只记录UTC时间(GMT + 0),则记录00:45和01:05,显着差异为20分钟。

基本上,当您尝试记录时间点时,您可能想要记录用户的时区,以便您可以告诉他们当时看到的内容......但您应该记录UTC中的日期/时间本身,便于操作(例如,转换到另一个时区)。您非常很少记录本地日期/时间;它对于重复发生的事件很有用(例如“每周当地时间下午2点”),但对于个别时间点而言,这只是一个坏主意。

请注意,记录UTC时间与记录服务器上的本地时间相同;您应该尝试确保服务器的时区与应用程序的行为完全无关......除了其他任何内容之外,这意味着如果您在不同时区中有多个服务器,则不会发生任何不良情况。鉴于NOW()使用系统本地时区,可以给出错误的答案 - 尝试使用使用UTC的函数是个好主意(例如使用{{1} }),或将MySQL中的“当前时区”设置为UTC。 (您声称已将日期存储在GMT-0中,但如果您使用UTC_TIMESTAMP,则不清楚您希望如何发生这种情况,除非 将时区设置为UTC)。

答案 1 :(得分:0)

我很确定你做得对。我确定它会给出托管MYSQL的服务器的时间。