为天真的日期时间添加 tzinfo 会导致奇怪的偏移量吗?
adding tzinfo for naive datetime cause strange offset?
我只是想为我的 datetime
对象添加 tzinfo
(没有具体时间)。我有 str
格式的日期和 str
格式的时区。
我创建了这个函数:
from datetime import datetime
import pytz
def _converttime(dt_str, tz_str):
dt = datetime.fromisoformat(dt_str)
tz = pytz.timezone(tz_str)
dt = dt.replace(tzinfo=tz)
return dt
当我使用 tzinfo
时一切看起来都很好:“Etc/GMT-6”:
a = _converttime("2018-01-01", "Etc/GMT-6")
print(f'a: {a}')
>>a: 2018-01-01 00:00:00+06:00
但是看看这个:
b = _converttime("2018-01-01", "Europe/Kirov")
print(f'b: {b}')
>>b: 2018-01-01 00:00:00+03:19
c = _converttime("2018-01-01", "America/Panama")
print(f'c: {c}')
>>c: 2018-01-01 00:00:00-05:18
为什么我会得到像 03:19、05:18 这样奇怪的值,而它应该是 03:00、-05:00?它最近引起了问题。
我想你想做的是使用 tz.localize
,你的函数将变成:
from datetime import datetime
import pytz
def _converttime(dt_str, tz_str):
dt = datetime.fromisoformat(dt_str)
tz = pytz.timezone(tz_str)
dt = tz.localize(dt)
return dt
使用这个函数你会得到正确的结果。
好的,我不知道这有什么问题,但我找到了使用 django 的解决方案 make_aware:
from django.utils.timezone import make_aware
def _converttime2(dt_str, tz_str):
dt = datetime.fromisoformat(dt_str)
tz = pytz.timezone(tz_str)
dt = make_aware(dt, tz)
return dt
我只是想为我的 datetime
对象添加 tzinfo
(没有具体时间)。我有 str
格式的日期和 str
格式的时区。
我创建了这个函数:
from datetime import datetime
import pytz
def _converttime(dt_str, tz_str):
dt = datetime.fromisoformat(dt_str)
tz = pytz.timezone(tz_str)
dt = dt.replace(tzinfo=tz)
return dt
当我使用 tzinfo
时一切看起来都很好:“Etc/GMT-6”:
a = _converttime("2018-01-01", "Etc/GMT-6")
print(f'a: {a}')
>>a: 2018-01-01 00:00:00+06:00
但是看看这个:
b = _converttime("2018-01-01", "Europe/Kirov")
print(f'b: {b}')
>>b: 2018-01-01 00:00:00+03:19
c = _converttime("2018-01-01", "America/Panama")
print(f'c: {c}')
>>c: 2018-01-01 00:00:00-05:18
为什么我会得到像 03:19、05:18 这样奇怪的值,而它应该是 03:00、-05:00?它最近引起了问题。
我想你想做的是使用 tz.localize
,你的函数将变成:
from datetime import datetime
import pytz
def _converttime(dt_str, tz_str):
dt = datetime.fromisoformat(dt_str)
tz = pytz.timezone(tz_str)
dt = tz.localize(dt)
return dt
使用这个函数你会得到正确的结果。
好的,我不知道这有什么问题,但我找到了使用 django 的解决方案 make_aware:
from django.utils.timezone import make_aware
def _converttime2(dt_str, tz_str):
dt = datetime.fromisoformat(dt_str)
tz = pytz.timezone(tz_str)
dt = make_aware(dt, tz)
return dt