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 – 时区问题

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

查看所有标签

猜你喜欢:

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

今日简史

今日简史

[以] 尤瓦尔·赫拉利 / 林俊宏 / 中信出版集团 / 2018-8 / 68

四年前,尤瓦尔•赫拉利的《人类简史》横空出世,颠覆了我们关于人类进化的认知。2016年,他的《未来简史》再度惊艳四座,刷新了我们对未来的想象,掀起了全球关于人工智能讨论的新思潮。现在,“简史三部曲”收官之作《今日简史》推出,将目光聚焦到当下,直面今天关乎我们每个人命运的问题和挑战。 尤瓦尔•赫拉利认为,智人之所以能够崛起成为地球的主宰者,主要原因在于其具备了虚构故事的能力。然而,在当前这样一......一起来看看 《今日简史》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码