Python中的时区转换

Posted

技术标签:

【中文标题】Python中的时区转换【英文标题】:timezone conversion in Python 【发布时间】:2013-11-24 18:19:24 【问题描述】:

我可能遗漏了一些关于时区的信息:

>>> import datetime, pytz
>>> date = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date.astimezone(pytz.UTC)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)

我期待

datetime.datetime(2013, 9, 3, 15, 00, tzinfo=<UTC>)

谁能解释一下这 51 分钟是从哪里来的?

谢谢,

让-菲利普

【问题讨论】:

【参考方案1】:

阅读pytz documentation开头的注释;使用.localize() 方法创建时区感知的日期时间对象:

import datetime
import pytz

naive_dt = datetime.datetime(2013,9,3,16,0)
dt = pytz.timezone("Europe/Paris").localize(naive_dt, is_dst=None)

to_s = lambda d: d.strftime('%Y-%m-%d %H:%M:%S %Z%z')
print(to_s(dt))
print(to_s(dt.astimezone(pytz.utc)))

输出

2013-09-03 16:00:00 CEST+0200
2013-09-03 14:00:00 UTC+0000

我不知道你为什么在这里期待15:00 UTC

【讨论】:

【参考方案2】:

感谢西蒙的回答。这让我意识到我对这一切的理解是多么肤浅。以下实验让我失去了更多...

>>> import datetime, pytz
>>> date_paris = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date_utc = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.utc)
>>> date_paris.astimezone(pytz.utc)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)
>>> date_utc.astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 18, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)

为什么在一个方向而不是另一个方向转换时会显示这 9 分钟的偏移量?下面这段代码集中了所有的失望:

>>> date_paris
datetime.datetime(2013, 9, 3, 16, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>)
>>> date_paris.astimezone(pytz.utc).astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 17, 51, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>) 

【讨论】:

【参考方案3】:

UTC 偏移量给出 (date.tzinfo.utcoffset(date)):

datetime.timedelta(0, 540)

这是 540 秒或 9 分钟。

在法国,1911 年 3 月 11 日切换到 UTC,时钟拨回 9 分 21 秒(source 1,source 2):

直到 1911 年,巴黎比世界标准时间晚 9 分 21 秒。

您也可以在此处 (Paris time in 1911) 看到时间从 3 月 11 日凌晨 12:01:00 到 3 月 10 日晚上 11:51:39。

【讨论】:

这看起来很奇怪..完全出乎意料 好的。看来我完全误解了 UTC 到底是什么! 好吧,***将欧洲中部时间定义为“比协调世界时 (UTC) 提前 1 小时。与 UTC 的时间偏移可以写为 +01:00”。我完全迷路了。

以上是关于Python中的时区转换的主要内容,如果未能解决你的问题,请参考以下文章

python - 如何在没有dateutil的情况下将时区感知字符串转换为Python中的日期时间?

如何在 Python 中检测字符串中的时间并将时间转换为不同的时区?

python中的常用模块

python中datetime怎么设置时区

如何根据 bigquery 中的时区列将 UTC 时间转换为本地时区?

php中的时区转换