我正在尝试以 ISO 格式 (
2024-09-05 01:09:11
) 显示一些 UTC 时间,作为本地时间 (2024-09-05 10:09:11+0900
)。以优雅的方式实现这一目标具有挑战性,最好仅使用本机 Python 库。
为了获取日期时间字符串,我这样做
>>> import time
>>> import datetime
>>> import pytz
>>> time.tzname
('JST', 'JST')
>>> utc_time = "2024-09-05 00:00:00"
>>> utc_dt = datetime.datetime.fromisoformat(utc_time)
>>> utc_dt.strftime("%Y-%m-%dT%H:%M:%S%z")
'2024-09-05T00:00:00'
但是,这不是 UTC 时间!这是本地化的:
>>> utc_dt.astimezone(pytz.timezone("Asia/Tokyo")).strftime("%Y-%m-%dT%H:%M:%S%z")
'2024-09-05T00:00:00+0900'
我的期望是,当未提供时区信息时,
fromisoformat
将采用 UTC,这意味着在 astimezone
操作(2024-09-05T09:00:00+0900
)之后,上述内容还将有 9 小时添加。相反,它保持不变。
为什么买?这不直观!如果未提供时区,那么人们很可能会假设 UTC IMO。如何以优雅的方式解决这个问题?我能想到的最好的办法就是在我的输入中添加
Z
:
>>> utc_time = "2024-09-05 01:09:11" + "Z"
>>> utc_dt = datetime.datetime.fromisoformat(utc_time)
>>> utc_dt.strftime("%Y-%m-%dT%H:%M:%S%z")
'2024-09-05T00:00:00+0000'
>>> utc_dt.astimezone(pytz.timezone("Asia/Tokyo")).strftime("%Y-%m-%dT%H:%M:%S%z")
'2024-09-05T09:00:00+0900'
这就是我想要的,但感觉就像黑客......有没有更好/优雅的方法来做到这一点?
问题:
fromisoformat
:这是一个简单的方法,意味着时区不会改变,直到它在日期时间字符串中明确提及,因此您会看到本地化时区。它将 str 转换为日期时间对象。您可以通过运行来检查它type(utc_dt)
2.astimezone
:稍后您使用 pytz 将其转换为 Asia/Tokyo tz,但日期时间已经在本地化时区(JST)中,因此 python 假设它已经在 Asia/Tokyo tz 中。使用本机库:日期时间
import datetime
# Input UTC time string
utc_time = "2024-09-05 01:09:11"
# convert time into datetime object
utc_dt = datetime.datetime.fromisoformat(utc_time)
tokyo_tz = datetime.timezone(datetime.timedelta(hours=9))
tokyo_time = utc_dt.astimezone(tokyo_tz)
print(tokyo_time.strftime("%Y-%m-%d %H:%M:%S%z"))