Python中两个时区之间的转换[重复]

Posted

技术标签:

【中文标题】Python中两个时区之间的转换[重复]【英文标题】:Conversion between two time zones in Python [duplicate] 【发布时间】:2021-09-09 01:59:15 【问题描述】:

我正在尝试在 Python 中转换两个时区的时间,但遇到以下问题。

代码

import pytz
import datetime

chicago_timezone = pytz.timezone("America/Chicago")
polish_time_zone = pytz.timezone("Europe/Warsaw")

chicago_time = datetime.datetime(2020,6,25,8,0,0,0,chicago_timezone)
print(chicago_time)

polish_time = chicago_time.astimezone(polish_time_zone)
print(polish_time)

输出

2020-06-25 08:00:00-05:51
2020-06-25 15:51:00+02:00

虽然正确的抛光时间应为 2020-06-25 15:00:00(时差为 7 小时)。 有人可以指导我吗?这让我有点困惑,我不明白为什么它没有按预期工作。

【问题讨论】:

你使用pytz不正确,你需要使用他们的localize函数。 见***.com/a/11474330/5987 感谢您快速而全面的回答! 你不是第一个遇到这个问题的人。我认为datetime 的设计者希望tzinfo 对象比实际使用时更加静态。 【参考方案1】:

您无法使用 pytz 以这种方式构建本地时间,因为时区在整个历史中都发生了变化。特定时区的特定偏移量取决于相关日期。像这样构建一个时区感知的日期时间并不能正确地运行该逻辑,并且最终会得到一个不正确的偏移量。

为此,pytz 提供了localize。像这样使用它:

chicago_time = chicago_timezone.localize(datetime.datetime(2020,6,25,8,0,0,0))

【讨论】:

"你不能这样构造当地时间,因为时区在整个历史中都发生了变化" - 不,这是因为pytz 句柄像这样的时区 @MrFuppes pytz 没有选择,因为datetime 构造函数没有给tzinfo 对象在给定日期更新自身的机会。 @MarkRansom 这并不是要以任何方式责备 pytz ^^ 只是想指出解释具有误导性。跨度> @MrFuppes 不,根据我的理解,解释是完全正确的。现在有人可能会质疑为什么pytz 默认使用最早的偏移量而不是最新的偏移量,但这只会在错误时改变条件,而不是消除它们。 @MrFuppes 我认为tzinfo 界面多年来也发生了变化。在编写pytz 时,您没有得到调用utcoffset 之类的成员函数时应用的日期时间,因此您必须知道。这就是localize 所做的。我能够找到一个在线 3.9 来使用 zoneinfo 并且它似乎也可以正常工作,但它从来不需要使用更原始的界面。【参考方案2】:

首先最好使用zoneinfo;这里没有这样的问题:

import datetime
from zoneinfo import ZoneInfo # Python 3.9

chicago_timezone = ZoneInfo("America/Chicago")
warsaw_timezone = ZoneInfo("Europe/Warsaw")

chicago_time = datetime.datetime(2020,6,25,8,0,0,0, chicago_timezone)
print(chicago_time)
# 2020-06-25 08:00:00-05:00

warsaw_time = chicago_time.astimezone(warsaw_timezone )
print(warsaw_time)
# 2020-06-25 15:00:00+02:00

【讨论】:

请注意,它仅在 3.9 之后可用... @deceze 是的,但这已经存在了一段时间了。 @MrFuppes 并不意味着它是普遍可用的。我在 Windows 7 上,Python 3.9 不支持,也永远不会支持。 @MarkRansom 好吧,OP 是这里的新用户,从我的角度来看,pytz 已经过时了,所以我认为值得一个答案来建议一种更新的方式来处理 Python 中的时区.顺便提一句。 Windows 7 也不支持 ;-) @MrFuppes 是的,它不再受支持,但它仍然是有史以来最好的 Windows 版本。

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

在具有正确日期的python中转换和计算日期时间对象的时区

使用 pytz 进行日期时间时区转换

Delphi - 获取非本地时区的 TTimeZone 并在时区之间转换 [重复]

使用pytz的Datetime时区转换

48 python判断时间是否落在两个时区之间(只比较时刻不比较日期)

从一个本地时区到另一个本地时区的 Python 日期时间转换(+ 奖励 DST)