在Django / Postgres中存储挂钟日期时间

问题描述 投票:0回答:1

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

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

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

  • 选择任何时区来存储时间戳,并始终在Python中应用实际时区之前抛弃此时区。
  • 将时间戳分为DateFieldTimeField
  • 将datetime存储为字符串。
  • 将日期时间存储为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
投票

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

  1. 设置USE_TZ = FalseTIME_ZONE = 'UTC'并使用日历时间。不会进行任何转换,因此基本上您只需存储日历时间并将其作为天真的日期时间返回。主要问题是这个设置是全局的,并且对于许多用途(例如auto_now)来说不是一个好的设置。
  2. 如上所述,但设置USE_TZ = True。只要您以UTC表示日历时间,就不会有任何不良转换。这里的问题是你会知道日期时间,所以你必须小心忽略或删除所有时区。
  3. 使用单独的DATE_FIELDTIME_FIELD。这可能是也可能不是一个好的解决方案,具体取决于您尝试运行的查询类型。
  4. 创建自己的使用timestamp without time zone的字段。 (或者也许是already exists?)

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

© www.soinside.com 2019 - 2024. All rights reserved.