Django – 时区问题

栏目: Python · 发布时间: 5年前

内容简介:Django 2.x关于时区有2个配置项:Django在这块设计主要是考虑到了国际化问题,所以初衷是希望在数据库里统一按UTC时区保存时间。可惜,我就是希望数据库里是本地时间保存,或者说我不希望受到Django设计的约束。

Django 2.x关于时区有2个配置项:

  • TIME_ZONE
  • USE_TZ

Django在这块设计主要是考虑到了国际化问题,所以初衷是希望在数据库里统一按UTC时区保存时间。

可惜,我就是希望数据库里是本地时间保存,或者说我不希望受到Django设计的约束。

前提

大家必须明确2个概念。

操作系统底层提供给应用的永远是UNIX时间戳,这个与任何时区无关。

UNIX时间戳只有根据时区,才能格式化出正确的时间字符串。

解决方法

设置正确的TIME_ZONE

怎么办呢?

首先,必须设置TIME_ZONE=’Asia/Shanghai’,因为Django会将该设置生效到 python 的datetime模块内部,将会覆盖datetime的默认时区配置(来自操作系统的)。

具体代码在 django/conf/__init__.py中:

        if hasattr(time, 'tzset') and self.TIME_ZONE:
            # When we can, attempt to validate the timezone. If we can't find
            # this file, no check happens and it's harmless.
            zoneinfo_root = Path('/usr/share/zoneinfo')
            zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split('/'))
            if zoneinfo_root.exists() and not zone_info_file.exists():
                raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
            # Move the time zone info into os.environ. See ticket #2315 for why
            # we don't do this unconditionally (breaks Windows).
            os.environ['TZ'] = self.TIME_ZONE
            time.tzset()

从代码可见,django通过time.tzset()影响了datetime模块的默认时区,如果我们不正确设置就会导致datetime模块永远无法得到正确的本地时间。

因此,你总是应该先设置正确的时区,这个不需要考虑USE_TZ如何。

设置USE_TZ=False

当我们USE_TZ=True的时候,Django只会使用datetime内的UNIX时间戳,按照UTC时区格式化成时间字符串,保存到数据库。同时,当从数据库读取时间字符串的时候也会按UTC时区还原为UNIX时间戳。

因此,我们要设置USE_TZ=False,才能让Django利用TIME_ZONE时区格式化字符串保存到数据库,同样的读取数据库时Django会按TIME_ZONE时区还原为UNIX时间戳。

总结

TIME_ZONE总是应该设置为本地时区。

USE_TZ=True则数据库总是按UTC时区格式化,USE_TZ=False则数据库按TIME_ZONE时区格式化,最终在内存中表现是一致的。

博主无私的分享着知识,你愿意送他一顿热腾腾的早餐吗?

Django – 时区问题

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Measure What Matters

Measure What Matters

John Doerr / Portfolio / 2018-4-24 / GBP 19.67

In the fall of 1999, John Doerr met with the founders of a start-up he’d just given $11.8 million, the biggest investment of his career. Larry Page and Sergey Brin had amazing technology, entrepreneur......一起来看看 《Measure What Matters》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试