Django:在提交模型前应将带时区的日期时间转换为UTC吗?
我有一些带时区的日期时间实例(比如tzinfo = "America/Los_Angeles"
),我想把它们保存到一个模型里。
我需要在保存之前把它转换成UTC时间吗?还是说我可以直接保存,因为它已经知道自己的时区了? 我之后需要用activate()
把它转换成用户的时区吗,还是说Django会自动帮我处理,因为这个实例已经有时区信息了?
我最想知道的是关于这方面的常规做法是什么。提前谢谢你们。
2 个回答
3
在保存时间之前,你不需要把它转换成UTC格式,因为Django会自动帮你处理这个问题。当你取出时间时,它会按照你在TIMEZONE
设置中定义的时区来显示。
如果你想改变这个时区,可以使用activate()
,想查看当前的时区,可以用django.utils.timezone.get_current_timezone()
。
这意味着你从数据库中取出的时间,可能和你最初保存这个对象时使用的日期时间对象的时区不同。不过,它们代表的时间点是一样的。
如果每个用户都有自己的时区,你应该把这个信息保存在用户的个人资料里,并在取出包含DateTimeField
的模型实例之前,先用用户的时区调用activate()
。这样取出的对象就会在正确的时区下。
另外,你也可以使用override()
这个上下文管理器。
如果你确定总是想要用户时区的datetime
对象,而不是服务器的时区,可以写一个自定义中间件,在request.user
上调用activate()
。你需要自己存储和获取时区,因为Django默认不知道用户的时区,也不会在用户模型中保存这个信息。