Python|时区转换
从dateutil parser
返回的大多数日期时间项都是幼稚的,这意味着它们没有明确的tzinfo 。 tzinfo 确定时区和 UTC 时间。它是 UTC 日期时间字符串的标准 ISO 格式。 UTC 是协调世界时,基本上等同于 GMT。 ISO 是国际标准组织,除其他外,它还确定标准日期时间设计。
Python日期时间项可以是幼稚的,也可以是有意识的。如果日期时间项具有 tzinfo,那么它就知道了。别的,日期时间是天真的。为了让一个简单的 datetime 对象时区感知,定义 tzinfo 抽象基类。在任何情况下, Python日期时间库只是描述了 tzinfo 的概念基类,并将其留给其他人来真正实现 tzinfo 创建。这就是 dateutil 的 tz 模块的用武之地——它提供了从你的操作系统时区信息中调高时区所需的一切。
安装:
Use pip or easy_install dateutil to install. Make sure that the operating system has timezone data.
On Linux, this is usually found in /usr/share/zoneinfo
, and the Ubuntu package is called tzdata. In case of the number of files and directories in /usr/share/zoneinfo
, such as America/ and Europe/, then it’s ready to proceed.
获取 UTC tzinfo 对象——通过调用tz.tzutc()
from dateutil import tz
tz.tzutc()
tzutc()
通过使用 UTC 日期时间对象调用utcoffset()
方法,偏移量为 0。
import datetime
tz.tzutc().utcoffset(datetime.datetime.utcnow())
datetime.timedelta(0)
将时区文件路径传递给gettz()
函数以获取其他时区的 tzinfo 对象。
tz.gettz('US/Pacific')
tzfile('/usr/share/zoneinfo/US/Pacific')
tz.gettz('Europe / Paris')
tzfile('/usr/share/zoneinfo/Europe/Paris')
tz.gettz('US / Pacific').utcoffset(datetime.datetime.utcnow())
datetime.timedelta(-1, 61200)
要将非 UTC 日期时间项更改为 UTC,必须注意时区。如果您尝试将轻信的日期时间更改为 UTC,您将获得 ValueError 豁免。为了记住一个简单的日期时间时区,您基本上使用正确的 tzinfo 调用replace()
策略。一旦日期时间项具有 tzinfo,此时可以通过使用tz.tzutc()
() 调用astimezone()
技术来执行 UTC 更改。
abc = tz.gettz('US/Pacific')
dat = datetime.datetime(2010, 9, 25, 10, 36)
dat.tzinfo
dat.astimezone(tz.tzutc())
Traceback (most recent call last):
File "/usr/lib/python2.6/doctest.py", line 1228, in __run
compileflags, 1) in test.globs
File "", line 1, in
dat.astimezone(tz.tzutc())
ValueError: astimezone() cannot be applied to a naive datetime
dat.replace(tzinfo = abc)
datetime.datetime(2010, 9, 25, 10, 36, tzinfo=tzfile(
'/usr/share/zoneinfo/US/Pacific'))
一切都在工作背后——
- tzutc 和 tzfile 项是 tzinfo 的两个子类。
- 考虑到所有因素,他们知道时区更改的正确 UTC 偏移量(对于 tzutc 为 0)。
- 一个 tzfile 项实现了如何细读工作框架的 zoneinfo 文档以获取基本的平衡信息。
- datetime 项的 replace() 策略顾名思义——它替换了质量。
- 一旦日期时间具有 tzinfo, astimezone() 策略很可能会相信使用 UTC 平衡的时间,然后用新的 tzinfo 替换当前的 tzinfo
代码:将 tzinfos 关键字参数传递到 dateutil 解析器以检测无法识别的时区
parser.parse('Wednesday, Aug 4, 2010 at 6:30 p.m. (CDT)',
fuzzy = True)
datetime.datetime(2010, 8, 4, 18, 30)
tzinfos = {'CDT': tz.gettz('US/Central')}
parser.parse('Wednesday, Aug 4, 2010 at 6:30 p.m. (CDT)',
fuzzy = True, tzinfos = tzinfos)
datetime.datetime(2010, 8, 4, 18, 30, tzinfo=tzfile('
/usr/share/zoneinfo/US/Central'))
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。