django 中的USE_TZ设置为true有何影响?

请问django 中的USE_TZ设置为true有何影响?
settings的配置如下:
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True

目前发现的问题是一个时间不准的问题:
有一个字段的定义如下:
created = models.DateTimeField(auto_now_add=True,
verbose_name=_('Created'))

打印出来为:datetime.datetime(2014, 2, 10, 8, 49, 23, tzinfo=)

在页面显示的时候需要进行格式的调整,简单来说就是通过月份和日期判断,为当天则只显示时间,否则显示日期加时间。

测试过程中发现,显示的时间早了8个小时,原因是“tzinfo=”引起的。
通过astimezone把时区调整了一下:
shanghai_tz=pytz.timezone("Asia/Shanghai")
order_sh_time = o_time.astimezone(shanghai_tz)

请问有人遇到类似的问题吗?
是否还存在其它的问题?多谢。

阅读 29.9k
2 个回答

Django Time Zone这个文档值得好好读一下。

Django如果开启了Time Zone功能,则所有的存储和内部处理,甚至包括直接print显示全都是UTC的。只有通过模板进行表单输入/渲染输出的时候,才会执行UTC本地时间的转换。

所以我建议后台处理时间的时候,最好完全使用UTC,不要考虑本地时间的存在。而显示时间的时候,也避免手动转换,尽量使用Django模板系统代劳。

这个需求,我可能会把复杂的东西提前——在输出之前先判断是否最近创建,并把这个结果直接写入记录对象,传递给模板系统:

    from django.utils.timezone import utc
    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    timediff = now - object1.created
    object1.just_created = True if timediff.days < 1 else False

然后在模板里只放简单的逻辑判断:

{% if object1.just_created %}
{{ object1.created|date:"H:i:s" }}
{% else %}
{{ object1.created|date:"Y-m-d H:i:s" }}
{% endif %}
<!-- 不做分支预测的受害者,最好把命中频繁的分支放在前边? -->

Time Zone是Django里边很有趣、也很有用的一个功能。我的树莓守望者项目中,UTC(或其他时区)与北京时间的协调,就深深受惠于这一点——项目中涉及时区变化的部分,全部由Django接管,再也不需要任何的说明或假设。

所以我的建议是:别怕麻烦,请在任何项目中都开启Time Zone,熟练了就没有坏处,并可能带来未来的收益。

https://www.fossen.cn/article...
在用MySQL做数据库,且django设置USE_TZ=True时,会遇到一个问题,就是按月份或日期筛选model数据时只能得到空集

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
宣传栏