【问题标题】:How should I store date/time objects in SQL?我应该如何在 SQL 中存储日期/时间对象?
【发布时间】:2011-10-26 03:28:52
【问题描述】:

我有这个问题很久了。问题是这样的:我使用过的大多数 SQL 服务器(即 MySQL)不存储带有日期的时区信息,所以我假设它们只是将日期存储为相对于服务器的本地时区。如果我必须将服务器迁移到不同的时区,或者如果我创建一个服务器分布在不同数据中心的集群,或者如果我需要将日期/时间正确转换为本地值,这会产生一个有趣的问题。

例如,如果我坚持一个像2011-08-12 12:00:00 GMT-7 这样的日期,它就会坚持为2011-08-12 12:00:00。如果我有一个事件发生在世界各地的特定时间,我必须假设我的服务器将日期存储在 GMT-0700 中,(我们甚至不将夏令时添加到混合中)然后根据每个事件将它们转换为日期用户的本地时区。如果我有多个服务器将日期存储在它们自己的时区中,那么所有这些都将失败。

对于像 Hibernate 和 Django 这样的框架,如果有的话,它们是如何处理这个问题的?我错过了什么,还是这是一个重大问题?

【问题讨论】:

    标签: django hibernate time timezone


    【解决方案1】:

    在我看来,最好的选择是:

    • 在将它们存储到数据库中时将所有时间转换为 UTC,并将它们从 UTC 本地化以进行显示
    • 将 UTC 偏移量以分钟为单位(至少一个现代时区是与 UTC 偏移量的十分钟的倍数)存储在与日期/时间不同的列中
    • 将时间戳存储为字符串

    在我当前的项目中,我们遇到了这个问题(我们使用 Postgres)并决定将所有时间存储在 UTC 中,并根据应用程序的需要进行转换。没有为我们单独存储时区。我们还决定所有使用时间戳的客户端-服务器交互都将使用 UTC,并且本地时区将只考虑用于用户交互。到目前为止效果很好。

    既然你用 Django 标记了这个问题,我要补充一点,pytz 模块对于处理语言环境时区转换非常有用。

    【讨论】:

    • 这是最有意义的。我以为数据库会自动处理这样的事情,但是嘿,没关系。我可能只是将所有内容存储在 UTC 中并根据客户时间进行翻译。如何强制 Django 以 UTC 保存?我有很多字段使用auto_nowauto_now_add,这可能会使事情复杂化。
    • 您需要使用 pytz 进行转换,然后使用 Django 存储“裸”时间戳。因为时区是一个如此混乱和政治化的概念,所以有一点学习曲线,但老实说,API 非常好,它涵盖了所有的极端情况。
    • 所以我不应该依赖auto_nowauto_now_add,而应该手动设置这些东西?
    • 嗯,Django 文档没有说明它是使用 utcnow() 还是基于语言环境的 now() 或数据库 NOW() 函数。如果它是 UTC 时间,那么你很好。如果它是数据库的 NOW() 函数,那么您所要做的就是将数据库设置为使用 UTC。但是,如果它是本地时间,基于启动服务器的用户的语言环境,那么这就是暴露,因为即使是简单的重启也可能突然改变那个时区。所以在第三种情况下,我建议不要使用auto_now
    【解决方案2】:

    你对 MySQL 的回答就在这个页面上MySQL Server Time Zone Support

    基本上,MySQL 为使用 UTC(时间戳)字段的任何字段提供自动时区支持,但不为不使用 UTC(日期、时间和日期时间字段)的字段提供自动时区支持。对于 UTC 字段,您可以使用 SET time_zone = timezone; 从客户端设置时区。对于非UTC字段,您必须自己计算。

    【讨论】:

    • 那么我是否应该简单地将每个日期时间和日期对象存储为 UTC,以保持一致?
    • 是的,因为时区存储为与 UTC 的偏移量。
    【解决方案3】:

    你说的太对了,我经常遇到这种情况,倾向于查找 TZ 并将其存储在静态“VARS”表中,这样至少我以后可以移动它。

    旁注:

    • 有趣的DATETIME manual 连提都不提了
    • 它受 NOW() 和 CURTIME() 的影响,如图所示here

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 2011-09-06
      相关资源
      最近更新 更多