Django:我应该在发布到模型之前将知晓的日期时间实例转换为UTC吗?

时间:2014-03-04 22:18:26

标签: python django datetime django-models django-timezone

我有了解日期时间实例(其中tzinfo = "America/Los_Angeles")我想要保存到模型中。

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

我最好奇的是这些惯例是什么。提前谢谢。

2 个答案:

答案 0 :(得分:7)

如果它是时区感知的,并且True设置为settings.pysettings.py django会在您保存时自动将其转换为UTC。

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

当您在模板中显示日期时间时,它将转换为{{1}}中USE_TZ设置的时区,除非您使用django的TIME_ZONE来激活不同的时区。

答案 1 :(得分:2)

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

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

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

如果每个用户都有一个时区,则应使用用户的配置文件保存此时区,并在检索包含DateTimeField的模型实例之前,使用用户的时区调用activate()。检索到的对象将位于适当的时区。

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

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