显示带有时区的当地时间 UTC 时间

问题描述 投票:0回答:1

我正在尝试以 ISO 格式 (

2024-09-05T00:00:00
) 显示一些 UTC 时间,作为本地时间 (
2024-09-05T09:00:00+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'

这就是我想要的,但感觉就像黑客......有没有更好/优雅的方法来做到这一点?

python datetime timezone
1个回答
0
投票

问题:

  • fromisoformat
    :这是一个幼稚的方法,意味着时区将 在日期时间字符串中明确提及之前不会更改 因此你会看到本地化时区。它将 str 转换为 日期时间对象。您可以通过运行来检查它
    type(utc_dt)

  • astimezone
    :稍后您将使用 pytz 将其转换为 Asia/Tokyo tz 但日期时间已经在本地时区(JST)中,因此 python 假设它已经在亚洲/东京 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"))
© www.soinside.com 2019 - 2024. All rights reserved.