【问题标题】:Handle Multiple Timezones in MySQL在 MySQL 中处理多个时区
【发布时间】:2014-06-13 02:03:44
【问题描述】:

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

     我正在为必要的 DDL 和 DML 查询提供 SQL Fiddle 链接 here。我还为每个用户编写了计算总登录时间的选择查询。因为用户 ID 为 3 和 4 的用户仍未注销,所以我使用 NOW() 来计算总登录时间。但他们来自不同的时区。我一直在使用 GMT-0 存储在 MYSQL 中。那么它是否会给我错误的用户 ID 3 和 4 的记录时间?如果错了,有什么解决办法?

【问题讨论】:

    标签: mysql optimization timezone


    【解决方案1】:

    那么它是否会给我错误的用户 ID 3 和 4 的记录时间?如果错了,有什么解决办法?

    如果您实际使用 GMT+0 记录值,不会给您错误的答案。对于用户来说,当地时间是什么并不重要 - 您感兴趣的只是登录和注销之间经过了多长时间。

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

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

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

    【讨论】:

    • 嗨@Jon Skeet.. 感谢您的快速回答,但如果它使用系统的本地时区(可能与 GMT- 不同),我应该使用 NOW() 0)?如果没有,我该如何计算时间?不可能?
    • @VishalZanzrukia:根据我的回答,我建议使用UTC_TIMESTAMP。或者将 connection 的时区设置为 UTC。
    【解决方案2】:

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

    【讨论】:

    • 由于 DST 的变化,使用服务器的本地时间是一个坏主意 - 并且您可能希望在不同的时区拥有多个服务器。 OP 声称使用 GMT-0 存储时间,但很难看出这与使用 NOW() 是否相符。
    猜你喜欢
    • 2011-06-27
    • 2016-10-17
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2015-03-29
    • 2021-12-28
    相关资源
    最近更新 更多