我想保存django中事件的未来墙锁定时间(我有分开存储的时区字符串)。
我不能简单地使用DateTimeField
,因为它可以执行timestamp with time zone
并始终在当前时区节省时间。它无法处理当前日期和实际事件日期之间的DST或可能的时区更改。
我可以使用以下任何选项:
- 选择任何时区以存储时间戳,并始终将这个时区扔掉,然后再在Python应用实际时区。
- 将时间戳拆分至
DateField
和TimeField
。 - 将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预订。
我看到了一些可能的解决方案:
-
设置
USE_TZ = False
和TIME_ZONE = 'UTC'
并使用日历时间。无法进行转换,因此,从本质上讲,您只是存储日历时间并将其作为天真的日期时间恢复。主要问题是此设置是全局的,对于许多用途(例如auto_now
)。 -
如上所述,但设置
USE_TZ = True
。只要您在UTC中表达日历时间,就不会有任何不良转换。这里的问题在于您将了解数据时,因此您必须注意忽略或删除各处的时区。 -
使用单独的
DATE_FIELD
和TIME_FIELD
。这可能是一个好的解决方案,具体取决于您要运行的疑问。 -
创建使用
timestamp without time zone
的字段。(或者也许已经存在?)
请注意,这个问题与过去与未来无关。这是要在时间上使用固定的时刻与日历(或壁钟)时间。您提出的要点当然是使用时间点代表日历时间的有效异议。