如何在Python中将UTC时间转换为本地时间?

4

我想将UTC日期时间2021-08-05 10:03:24.585Z转换为印度日期时间,应该如何转换?

我尝试过的方法是:

from datetime import datetime

from pytz import timezone

st = "2021-08-05 10:03:24.585Z"

datetime_object = datetime.strptime(st, '%Y-%m-%d %H:%M:%S.%fZ')

local_tz = timezone('Asia/Kolkata')
start_date = local_tz.localize(datetime_object)
print(start_date.replace(tzinfo=local_tz))

但是输出的时间仍然不符合我提到的时区,我该如何转换时间并打印出正确的时间。

输出结果:

2021-08-05 10:03:24.585000+05:21

@deceze 当我尝试打印只有start_date时,输出结果是2021-08-05 10:03:24.585000+05:30 - hamere
请转换以下与编程有关的内容,从英语到中文。 仅返回翻译后的文本:参见例如在不同时区显示时间如何解析ISO 8601格式日期? - FObersteiner
@MrFuppes 当我使用astimezone()时,它显示无法转换为naive datetime。我是一个新手,你能抽出一些时间帮助我解释一下吗? - hamere
问题出在你的解析指令中的 Z。它会让 strptime 忽略 "Z" 应该被解析为 aware datetime 的事实,其中 aware 意味着 datetime 对象“知道”它属于某个特定的时区,这里是 UTC。 - FObersteiner
3个回答

5
您可以像这样使用:

您可以使用类似以下的方式:

from datetime import datetime
from dateutil import tz

from_zone = tz.gettz('UTC')
to_zone = tz.gettz('Asia/Kolkata')

utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S')

utc = utc.replace(tzinfo=from_zone)

central = utc.astimezone(to_zone)

如何以编程方式获取正确的本地时区? - Jonathan Hartley
@JonathanHartley 你需要使用第三方库 tzlocal - FObersteiner

4

将日期/时间字符串正确解析为UTC日期时间,并使用astimezone而不是replace将其转换为特定的时区(新版Python(3.9+)中的选项在注释中):

from datetime import datetime
# from zoneinfo import ZoneInfo
from dateutil.tz import gettz

st = "2021-08-05 10:03:24.585Z"
zone = "Asia/Kolkata"

# dtUTC = datetime.fromisoformat(st.replace('Z', '+00:00'))
dtUTC = datetime.strptime(st, '%Y-%m-%d %H:%M:%S.%f%z')

# dtZone = dtUTC.astimezone(ZoneInfo(zone))
dtZone = dtUTC.astimezone(gettz(zone))

print(dtZone.isoformat(timespec='seconds'))
# 2021-08-05T15:33:24+05:30

如果您只需要本地时间,也就是您计算机的设置,您可以同样使用 astimezone(None)


这会导致错误 AttributeError: type object 'datetime.datetime' has no attribute 'fromisoformat' - hamere
@hamere:你使用的是哪个Python版本? - FObersteiner
我使用Python 3.7版本。 - hamere
@hamere 听起来像是“升级的时候了”^^ 实际上,这个功能是在Python 3.7中引入的,所以它应该可以工作...你可以尝试使用datetime.strptime(st,'%Y-%m-%d %H:%M:%S.%f%z') - FObersteiner
@hamere 检查是否安装了其他版本。 - Smart Manoj

0

在Python 3.10.8中

from datetime import datetime
st = "2021-08-05 10:03:24.585Z"
dtUTC = datetime.fromisoformat(st[:-1]+'+00:00')
dtUTC = dtUTC.astimezone()
print(dtUTC.isoformat(timespec='seconds'))
# 2021-08-05T15:33:24+05:30


无法重现代码是否正确工作。我的机器设置为UTC+2,因此该代码会返回2021-08-05T10:03:24+02:00 - 这是错误的,因为输入应该是UTC,而不是UTC+2。 - FObersteiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接