【问题标题】:Client -> server time differences and time storage客户端 -> 服务器时差和时间存储
【发布时间】:2015-02-23 16:45:23
【问题描述】:

我正在开发一个客户端应用程序,当用户阅读某些内容时,我会将其“保存”到数据库中,包括时间和日期。起初我想使用 NOW() (mysql) 并让 server/db 做艰苦的工作,但后来我意识到服务器时间和客户端时间之间存在差异。

为了克服这个问题,每当我调用在数据库中存储此信息的 API 时,我都会将客户端日期时间作为参数之一传递。没什么大不了的,我只是想知道,有没有更好的方法呢?

【问题讨论】:

    标签: mysql timezone client-server


    【解决方案1】:

    你对服务器有控制权吗?

    您无法确保客户端的日期/时间是正确的,因此请改用服务器时间(即使它在给定的时间点是正确的,它也可能会改变并给您带来不一致的结果)。

    服务器和客户端时间不同的唯一有效原因是它们位于不同的时区(如果它们因其他原因而不同,那是客户端的问题,而不是你的问题)。

    解决方案是将客户端时区与时间作为 UTC(时间戳)一起存储在服务器上,并让数据库或您的脚本进行转换以向客户端显示正确的日期/时间。

    我不太了解 mysql 处理日期/时间值的方式,但您似乎无法将时区与时间值一起自动存储,因此您必须手动进行:

    • 创建附加到每个客户端的时区列。
    • 每当您在 mysql 中存储日期/时间时,将其从您的服务器时区转换为 UTC:GMT+0(Mysql 可能会自动执行此操作)。
    • 每当客户端检索日期/时间时:获取 UTC 时间和时区,并进行转换(这可以在客户端或服务器端完成)。

    大多数网络语言都有管理日期/时间和时区的标准方法。

    您也可以设置 mysql 会话时区,如下所示:mysql timestamp tutorial 但我认为第一个解决方案更灵活且不依赖于 mysql。

    我希望现在更清楚了。

    【讨论】:

    • 问题出在时区上。如果用户在下午 2 点阅读它,那么数据库会将其存储为下午 5 点(例如),所以您说我应该存储用户时区,所以每当我向用户获取此信息时,我会将其翻译回他的时区?有没有更自动化的方法呢?你写了一些关于 UTC 的东西,你能再解释一下吗?
    • 更新后:这个问题分为2个:第一个不太可能是客户端移动到不同的时区,第二个更有可能是MYSQL DB将移动到不同的服务器,这意味着不同的时区,所以我保留的所有时区都将无关紧要
    • 这就是为什么您必须将日期/时间存储为 UTC。这样,它将始终保持一致。如果您的服务器移动到另一个时区:没关系,一切都存储为 UTC。如果客户移动到不同的时区:有几种方法可以根据您的需要进行管理:让用户更改所有记录的 TZ 配置,每个日期/时间都将使用新的或添加时区历史记录进行调整。
    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多