【问题标题】:Storing wall-clock datetimes in Django/Postgres在 Django/Postgres 中存储挂钟日期时间
【发布时间】:2019-03-11 12:08:03
【问题描述】:

我想为 Django 中的事件保存未来的挂钟日期时间(我有单独存储的时区字符串)。

我不能简单地使用DateTimeField,因为它强制执行timestamp with time zone 并始终节省当前时区的时间。它不处理 DST 或当前日期和实际事件日期之间可能的时区变化。

我可以使用以下任何选项:

  • 选择任何时区来存储时间戳,并始终在应用 Python 中的实际时区之前丢弃该时区。
  • 将时间戳拆分为DateFieldTimeField
  • 将日期时间存储为字符串。
  • 将日期时间存储为timestamp without time zone 的自定义字段。

但它使查询变得更加困难并且看起来很奇怪。

还有什么更好的选择吗?这个用例似乎很常见,所以我想有更好的方法吗?

编辑:我的用例:

假设我的用户想要预约 2019-12-20 10:00,目前是 2019-03-10。我知道该用户的时区(它单独存储为字符串,如“US/Eastern”)。

如果我假设 EST 从 2019 年 11 月 3 日开始,我能做的最好的是将时间戳存储到 2019-12-20 15:00:00+00:00(或 2019-12-20 10:00-05:00。我不希望这样,因为:

  • 我不知道我的 tzdata 是否有未来日期时间的正确信息
  • 即使目前确实如此,我不知道美国/东部时区是否会发生任何意外变化,如果不是美国,情况会变得更糟。不保证未来 DST 更改。
  • 如果用户移动到不同的时区,我将不得不重新计算每个约会,同时注意 DST。
  • 如果在重新计算期间 tzdata 发生变化...我们不要考虑这个问题。

我更愿意将未来的日期存储为天真的日期时间 + 时区字符串,如“美国/东部”,并且(几乎)从不为超过一周的任何日期构建 tz 感知日期时间。 Django + postgres 目前强制我使用timestamp with time zone,它非常适合记录日志和过去的事件,但它有固定的偏移量(甚至不是时区名称),因此它不适合未来的挂钟日期时间。

对于这个用例,假设我不关心模棱两可的时间:没有多少用户想在凌晨 02:00 预订。

【问题讨论】:

    标签: django postgresql timezone


    【解决方案1】:

    我看到了一些可能的解决方案:

    1. 设置 USE_TZ = FalseTIME_ZONE = 'UTC' 并使用日历时间。不会进行任何转换,因此基本上您只是存储日历时间并将其作为天真的日期时间取回。主要问题是这个设置是全局的,对于很多用途来说不是一个好的设置(例如auto_now)。

    2. 如上,但设置USE_TZ = True。只要您以 UTC 表示您的日历时间,就不会有任何不良转换。这里的问题是你会知道日期时间,所以你必须小心忽略或删除所有地方的时区。

    3. 使用单独的DATE_FIELDTIME_FIELD。这可能是也可能不是一个好的解决方案,具体取决于您尝试运行的查询类型。

    4. 创建您自己的使用timestamp without time zone 的字段。 (或者可能是already exists?)

    请注意,此问题与过去与未来无关。这是关于想要使用固定的时间而不是日历(或挂钟)时间。您提出的观点当然是对使用时间点表示日历时间的有效反对意见。

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多