在Django/Postgres中存储壁挂数据



我想保存django中事件的未来墙锁定时间(我有分开存储的时区字符串)。

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

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

  • 选择任何时区以存储时间戳,并始终将这个时区扔掉,然后再在Python应用实际时区。
  • 将时间戳拆分至DateFieldTimeField
  • 将DateTime存储为字符串。
  • 将DateTime存储为timestamp without time zone的自定义字段。

,但它使查询更加困难,而且看起来很奇怪。

我想念什么更好的选择吗?这个用户酶似乎很普遍,所以我想有更好的方法可以做到吗?

编辑:我的用户:

假设我的用户想预约2019-12-20 10:00,目前是2019-03-10。我知道该用户的时区(它单独存储为"我们/东部"之类的字符串)。

如果我认为EST始于2019年11月3日,我能做的最好的是将时间戳存储至2019-12-20 15:00:00+00:00(或2019-12-20 10:00-05:00。我不想要此,因为:

  • 我不知道我的tzdata是否有正确的DateTime信息
  • 即使目前确实如此,我也不知道我们/东部时区是否会发生任何意外的变化,而当它不是我们的情况下,情况会变得更糟。未来的DST更改不能保证。
  • 如果用户移至不同的时区,我将不得不重新计算每个约会,同时照顾DST。
  • 如果TZDATA在此重新计算过程中发生了变化...不要考虑这一点。

我宁愿将未来的日期存储为幼稚的日期 时区字符串,例如'us/eastern',并且(几乎)永远不会在任何日期内构造tz-ware dateTime。Django Postgres目前迫使我使用timestamp with time zone,这非常适合日志和过去的事件,但是它具有固定的偏移量(甚至不适合时区名称),因此它不适合将来的wall钟dateTimes。

对于这个用户酶,假设我不在乎模棱两可的时代:用户不太想在上午02:00预订。

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

  1. 设置USE_TZ = FalseTIME_ZONE = 'UTC'并使用日历时间。无法进行转换,因此,从本质上讲,您只是存储日历时间并将其作为天真的日期时间恢复。主要问题是此设置是全局的,对于许多用途(例如auto_now)。

  2. 如上所述,但设置USE_TZ = True。只要您在UTC中表达日历时间,就不会有任何不良转换。这里的问题在于您将了解数据时,因此您必须注意忽略或删除各处的时区。

  3. 使用单独的DATE_FIELDTIME_FIELD。这可能是一个好的解决方案,具体取决于您要运行的疑问。

  4. 创建使用timestamp without time zone的字段。(或者也许已经存在?)

请注意,这个问题与过去与未来无关。这是要在时间上使用固定的时刻与日历(或壁钟)时间。您提出的要点当然是使用时间点代表日历时间的有效异议。

相关内容

  • 没有找到相关文章

最新更新