使用时区保存时区感知日期时间

时间:2020-08-13 22:51:05

标签: python django

我正在寻找一种方法来保存datetime的特定时区而不是已建立的时区,但是我有以下设置:

TIME_ZONE = "UTC"

USE_TZ = True

这很方便,因为在大多数情况下,我希望将日期保存在UTC中,但是有时我需要跟踪用户设置的本地日期时间。 有谁知道如何保存日期时间而不转换为默认时区(UTC)?

我正在使用PostgreSQL,所以我不知道这是否可能...

欢迎任何提示。

1 个答案:

答案 0 :(得分:0)

当心将其时区存储在数据库系统中,因为从引擎本身到客户端,再到各种第三方库(包括Django ORM),到处都有太多可疑的实现,这些实现每年都在堆积

例如,来自Postgres文档:

所有支持时区的日期和时间都内部存储在UTC中。他们 在TimeZone指定的区域中转换为本地时间 配置参数,然后显示给客户端。

这意味着,如果您保存了一个来自Django的时区“欧洲/罗马”本地化的datetime,并且将客户端设置为使用时区“ America / New_York”,然后使用配置了时区的客户端来读取它欧洲/伦敦”,无论如何,您都将获得与原始datetime相对应的英国时间。

我发现使用数据库系统处理时区的唯一可靠方法是分别保存时区 。例如,在用户配置文件的“时区”中,或者如果存储对时区某种程度上敏感的事件(即登录名,传感器读数等),则使用“时间戳” +“时区”字段的组合。 / p>

通过这种方式,您可以将所有时间戳存储在UTC中(无论如何,Postgres都会这样做),一旦它们脱离数据库,就可以将它们本地化在您的应用程序中,这更加清晰,健壮和数据库-系统独立。

请注意,如果要归档时间戳(即从,到),则需要在UTC上执行查询,并且如果要使用时间数学(即,用户X在“ America / New_York”时区的星期一的所有登录名) “)在任何情况下都会很痛苦(您可以在这里PostgreSQL date() with timezone尝一尝)。