在Django中使用天真和时区感知日期时间

时间:2013-04-08 18:13:38

标签: python django datetime

Django文档非常清楚,不应该使用天真的日期时间,但我有一个用例,我认为在我认为需要它们的地方相当普遍。有时在我的项目中有必要跨时区查询对象,但是基于当地时间。

例如,这只是一个人为的例子,假设我想找到所有在给定日期下午4点到5点之间更新其个人资料的用户,根据每个用户的本地时区。我可以这样做:

qs = User.objects.filter(profile__datelastupdated__gte=datetime(2013,4,1,16))
qs = qs.filter(profile__datelastupdated__lte=datetime(2013,4,1,17))

但是,因为我有时区支持激活,会导致警告:

RuntimeWarning: DateTimeField received a naive datetime (YYYY-MM-DD HH:MM:SS) while time zone support is active.

我明白为什么警告会被抛出,所以我的问题是:我不是以正确的方式考虑约会时间吗?是否有一种自觉的Django方式来获得tz意识到日期时间的特异性,这是你想要的,并且还有天真的日期时间提供的有时需要的通用性?

1 个答案:

答案 0 :(得分:0)

您必须使用datetime + timezone过滤数据库,数据库中的所有日期始终存储为utc。如果您提供没有时区的日期,则django会将其视为默认值,并为您提供交战 如果您支持时区,则必须存储用户时区。 询问带有日期+当前用户时区的数据库与投放日期相同。