Skip to content

Latest commit

 

History

History
56 lines (34 loc) · 2.23 KB

时区.md

File metadata and controls

56 lines (34 loc) · 2.23 KB

django配置了TIME_ZONE = "Asia/Shanghai" 所以无关容器的时区,在python manage.py shell 里面是正常的东八时区。

跟use_tz没有关系,如果设置为True。Django会采用Aware对象的形式使用日期和时间。 设置为False会采用Naive对象的形式使用日期和时间。

False:如果直接datetime类型更新进数据库的话,就是该时区的字符串。如果拿回来也是该时区的,就刚好能对得上。但是如果存进去是某个时区的字符,拿回来是另一个时区的,就有有问题。 可以通过去掉time_zone进行测试。所以加上use_tz数据库,db连接能帮我们处理。

测试:

# use_tz=True 没有TIME_ZONE 数据库上海时区显示:2020-04-24 08:14:31.338043
AuthUser.objects.values().first()['date_joined']
datetime.datetime(2020, 4, 24, 8, 14, 31, 338043, tzinfo=<UTC>)

AuthUser.objects.filter(id=1).update(date_joined=datetime.now())
/usr/local/lib/python3.7/site-packages/django/db/models/fields/__init__.py:1447: RuntimeWarning: DateTimeField AuthUser.date_joined received a naive datetime (2020-04-24 03:14:31.338043) while time zone support is active.
  RuntimeWarning)


In [10]: datetime.now().astimezone()
Out[10]: datetime.datetime(2020, 4, 24, 3, 23, 7, 944583, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=68400), 'CDT'))

In [11]: datetime.now()
Out[11]: datetime.datetime(2020, 4, 24, 3, 23, 11, 29508)

AuthUser.objects.filter(id=1).update(date_joined=datetime.now().astimezone())
2020-04-24 08:20:48.056301
东八时间为 2020-04-24 16:20:48.056301

启用 USE_TZ = True 后,处理时间方面,有两条 “黄金法则”:

  • 保证存储到数据库中的是 UTC 时间;参考上面的例子
  • 在函数之间传递时间参数时,确保时间已经转换成 UTC 时间;

反思:这个总结写的究竟是什么玩意。自己重新看都看不懂了。总结写人性化些。。。


TODO

数据库的时区:

select now(), CAST(now() AS char) as nc, @@session.time_zone, @@global.time_zone
-- 2021-05-25 03:44:59 1621914299.0 2021-05-25 03:44:59 2021-05-25 03:44:59 ['SYSTEM', 'SYSTEM']

跟随着系统