5

知道tzinfo = "America/Los_Angeles"我想保存到模型的日期时间实例(在哪里)。

我应该在保存之前以某种方式将其转换为 UTC 吗?还是我可以按原样保存它,因为它知道自己的时区?我是否需要稍后将其转换为用户的时区activate(),或者 Django 是否会为我这样做,因为实例是知道的?

我很好奇这方面的惯例是什么。提前致谢。

4

2 回答 2

7

如果它是时区感知的并且您已 在django 中USE_TZ设置为,则保存时会自动将其转换为 UTC。Truesettings.py

当您稍后从数据库中检索它时,它将感知时区但设置为 UTC:django 不会保存它以前的时区。

当您在模板中显示日期时间时,它将转换为您在 中设置的时区TIME_ZONEsettings.py除非您使用 django 的时区实用程序来激活不同的时区。

于 2014-03-04T22:27:40.337 回答
2

您不必在保存之前将其转换为 UTC,因为 Django 会自动为您执行此操作。当您检索它时,它将作为TIMEZONE设置中定义的时区检索。

您可以覆盖它activate()并查看当前时区,使用django.utils.timezone.get_current_timezone().

这意味着您从数据库中检索的时间可能与您最初用于保存对象的日期时间对象的时区不同。但是,它仍将是同一时刻。

如果您对每个用户都有一个时区,您应该将其与用户的个人资料一起保存,并activate()在检索包含DateTimeField. 检索到的对象将位于适当的时区。

或者,您可以使用override()上下文管理器。

如果您确定始终希望datetime对象位于用户的时区而不是服务器的时区,请编写一个自定义中间件来调用activate(). request.user您需要自己存储/检索时区,因为 Django 无法知道用户的时区是什么,并且默认情况下不会将其存储在 User 模型中。

于 2014-03-04T22:31:42.027 回答