📜  Python|时区转换

📅  最后修改于: 2022-05-13 01:55:32.881000             🧑  作者: Mango

Python|时区转换

dateutil parser返回的大多数日期时间项都是幼稚的,这意味着它们没有明确的tzinfo 。 tzinfo 确定时区和 UTC 时间。它是 UTC 日期时间字符串的标准 ISO 格式。 UTC 是协调世界时,基本上等同于 GMT。 ISO 是国际标准组织,除其他外,它还确定标准日期时间设计。

Python日期时间项可以是幼稚的,也可以是有意识的。如果日期时间项具有 tzinfo,那么它就知道了。别的,日期时间是天真的。为了让一个简单的 datetime 对象时区感知,定义 tzinfo 抽象基类。在任何情况下, Python日期时间库只是描述了 tzinfo 的概念基类,并将其留给其他人来真正实现 tzinfo 创建。这就是 dateutil 的 tz 模块的用武之地——它提供了从你的操作系统时区信息中调高时区所需的一切。

安装:

获取 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'))