Django:在提交模型前应将带时区的日期时间转换为UTC吗?

5 投票
2 回答
1284 浏览
提问于 2025-04-17 20:51

我有一些带时区的日期时间实例(比如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默认不知道用户的时区,也不会在用户模型中保存这个信息。

8

如果你的时间设置是支持时区的,并且在你的 settings.py 文件中把 USE_TZ 设为 True,那么当你保存时间的时候,django 会自动把它转换成 UTC 时间。

当你之后从数据库中取出这个时间时,它会是支持时区的,但会显示为 UTC 时间:django 不会保存它原来的时区信息。

在模板中显示这个时间时,它会根据你在 settings.py 中设置的 TIME_ZONE 来转换成相应的时区,除非你使用 django 的 时区工具 来激活其他的时区。

撰写回答