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,熟练了就没有坏处,并可能带来未来的收益。