gpt4 book ai didi

python - str 到 python 3 中的时间对象

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:11 25 4
gpt4 key购买 nike

给定一对代表 ISO 8601str 对象时间和时区:

time_str = '09:30'

time_zone_str = 'America/New_York'

如何将这 2 个字符串解析为 time ( not datetime ) 对象?

注意:显然可以将 time_str 拆分为 ':' 并使用时间构造函数,但解析会有点棘手以计算元素的数量在结果列表中了解 str 的分辨率(分、秒、微秒)。这是因为 ISO 8601允许不同的表示:

 time_str_short = '09:30'

time_str_long = '09:30:00'

提前感谢您的考虑和回复。

最佳答案

“我可以这样做吗?”的答案(带时区)既是又不是。首先让我们将字符串转换为 time 对象。正如一位评论者所提到的,您可以在 python 3.7 中使用 fromisoformat 执行此操作方法:

from datetime import time
time.fromisoformat("09:30")

如果你没有使用 3.7,你可以通过创建一个 datetime 然后转换为一个时间 object 来做到这一点:

from datetime import datetime, time
as_time = datetime.datetime.strptime("09:00", "%H:%M").time()

现在来处理时区。由于时区是一个名称,我们可以使用非常方便的 pytz模块将其转换为 tzinfo 对象:

pytz.timezone('America/New_York')

此时您可能想将它作为 tzinfo 参数传递给时间构造函数,但不幸的是,这不适用于 pytz:

Unfortunately using the tzinfo argument of the standard datetime constructors ‘’does not work’’ with pytz for many timezones. ~ http://pytz.sourceforge.net/

所以我们将不得不使用新创建的 tzinfo 对象的 localize 方法。但不幸的是,我们仍然无法使用这个时区成功地本地化 time 对象。这样做的原因是 pytz 需要知道日期以确定该时区是否处于夏令时。由于我们没有提供日期,因此实现这一目标是不可能的,您会得到奇怪的结果,例如:

>>> pytz.timezone('America/New_York').localize(as_dt).isoformat()
'1900-01-01T09:00:00-04:56'

注意 -04:56 偏移量,这是乱码。有几种选择可以达到您最终想要的效果。

一种选择是假设时间是今天的时间:

as_time = datetime.datetime.strptime("09:00", "%H:%M").time()
tz = pytz.timezone('America/New_York')
local_time = tz.localize(datetime.datetime.now().replace(hour=as_time.hour, minute=as_time.minute))

另一种选择是使用简单的时区偏移量而不是时区名称:

from datetime import timezone, timedelta  
naive_tz = timezone(timedelta(hours=5))
datetime.time(9, 30).replace(tz_info=naive_tz)

但我不推荐这种方法,因为它非常脆弱,并且需要一些中间步骤才能从非平凡的 TZ 位置名称派生。

关于python - str 到 python 3 中的时间对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com