繁体   English   中英

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

[英]Save timezone aware datetime with its timezone

我正在寻找一种方法来保存datetime与既定时区以外的特定时区,但是我有以下设置:

TIME_ZONE = "UTC"

USE_TZ = True

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

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

欢迎任何提示。

小心在数据库系统中存储日期及其时区,因为从引擎本身到客户认为的各种第三方库(包括 Django ORM),到处都堆积了太多有问题的实现。

例如,来自 Postgres 文档:

所有可识别时区的日期和时间都以 UTC 格式在内部存储。 在显示给客户端之前,它们会转换为 TimeZone 配置参数指定的区域中的本地时间。

这意味着,如果您从datetime保存本地化的时区“欧洲/罗马”的日期时间,并且客户端设置为使用时区“美国/纽约”,然后您使用配置了时区“欧洲/伦敦”的客户端读取它,您将获得无论如何,对应于原始datetime的英国时间。

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

通过这种方式,您可以将所有时间戳存储在 UTC 中(无论如何,Postgres 都会这样做),然后在它们从数据库中取出后将它们本地化到您的应用程序中,这更加清晰、健壮且独立于数据库系统.

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM