2017-09-12 30 views
0

我有一个模型“成员”,其中有两个字段“created_at”和“updated_at”。 原来,他们被定义如下:记录创建和更新时间不存储在localtime django

created_at = models.DateTimeField(auto_now_add=True, null=True) 
updated_at = models.DateTimeField(auto_now_add=True, null=True) 

我settings.py有USE_TZ =真和TIME_ZONE = “美国/纽约”。

我有一个自定义的中间件,用于激活用户选择的时区。

current_tz = pytz.timezone("<user defined timezone>") 
timezone.activate(current_tz) 

然后,我更新字段存储用户本地时间:

created_at = models.DateTimeField(default= lambda: timezone.localtime(timezone.now()), null=True) 
updated_at = models.DateTimeField(default= lambda: timezone.localtime(timezone.now()), null=True) 

现在,当我更新会员记录,并检查的updated_at时间,其显示相同的UTC时区,而不是用户的本地时间。

难道Django的总是存储在UTC在DB datetime值还是我失去了一些东西在这里

+0

此代码将只使用服务器的本地时间,而不是用户。 –

+0

我编辑了我的问题,提到了一个中间件,可根据用户选择的时区激活时区。那么,如何让它使用用户的localtime而不是服务器呢? – user2722127

+1

够公平的。但这似乎仍然是一个糟糕的主意。为什么你要存储本地时间,而不是 - 如[文档](https://docs.djangoproject.com/en/1.11/topics/i18n/timezones/)中明确推荐的那样 - 存储UTC和输出转换? –

回答

1

您所有的需求应注重USE_TZ = True

如果设置为USE_TZ = True,DateTimeField存储UTC时间。 如果你在settings.py中评论USE_TZ = True,你可以得到你想要的。

但是在项目中,如果打开USE_TZ,所有存储或内部处理甚至打印都是UTC时区,最好始终打开USE_TZ。当您在模板中显示时,对于time format conversion非常方便。

相关问题