我有了解日期时间实例(其中tzinfo = "America/Los_Angeles"
)我想要保存到模型中。
在保存之前,我应该以某种方式将其转换为UTC吗?或者我可以按原样保存它,因为它知道它自己的时区吗?我是否需要稍后使用activate()
将其转换为用户的时区,或者Django会为我做这个,因为实例知道吗?
我最好奇的是这些惯例是什么。提前谢谢。
答案 0 :(得分:7)
如果它是时区感知的,并且True
设置为settings.py
,settings.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无法知道用户的时区是什么,并且默认情况下不会将其存储在用户模型中。