面临将 utc 时区转换为本地时区的困难

facing difficulties converting utc timezone to local

我得到这样的日期和时间

date_time =  "2022-02-17 08:29:36.345374"

为了将这些转换为 AM、PM 格式,我正在做类似的事情

date_formate = datetime.fromisoformat(date_time).strftime('%d/%m/%Y %I:%M %p')

但我得到的结束时间不是本地时间,似乎是 UTC,我正在尝试将其转换为 utc,但没有运气做这样的事情

dtUTC = datetime.fromisoformat(date_formate[:-1])
dtZone = dtUTC.astimezone()
print(dtZone.isoformat(timespec='seconds'))

在 Whosebug 上找到了这个解决方案,但 收到错误 Invalid isoformat string: '2022-02-17 08:29:36.345374'

如果您不指定时区/UTC 偏移量,

Python 默认采用本地时间。所以在这种情况下,需要先设置UTC,然后转换,再格式化(如果你想要一个字符串作为输出):

from datetime import datetime, timezone

date_time =  "2022-02-17 08:29:36.345374" # UTC is not specified here...

local = datetime.fromisoformat(date_time).replace(tzinfo=timezone.utc).astimezone()
print(local) # my tz was on UTC+1 at that date...
# 2022-02-17 09:29:36.345374+01:00

local_formatted = local.strftime('%d/%m/%Y %I:%M %p')
print(local_formatted)
# 17/02/2022 09:29 AM

如果astimezone(None)不行,可以试试tzlocal;

import tzlocal
zone = tzlocal.get_localzone()
local = datetime.fromisoformat(date_time).replace(tzinfo=timezone.utc).astimezone(zone)
local_formatted = local.strftime('%d/%m/%Y %I:%M %p')
print(local_formatted)
# 17/02/2022 09:29 AM

或从 timedelta 派生时区对象,例如

from datetime import timedelta
zone = timezone(timedelta(minutes=-300)) # UTC-5 hours
local = datetime.fromisoformat(date_time).replace(tzinfo=timezone.utc).astimezone(zone)
local_formatted = local.strftime('%d/%m/%Y %I:%M %p')
print(local_formatted)
# 17/02/2022 03:29 AM