파이썬 3.9.1 날짜 시간 산술
Dec 03 2020
python3.9.1에서 새로운 zoneinfo 지원을 시도하는 동안 아래 프로그램의 출력에서 볼 수 있듯이 datetime 인식 객체의 시간 차이가 pytz에 의해 생성 된 것과 다르다는 것을 알았습니다.
import datetime,zoneinfo,pytz
from sys import version_info
print(f'Python{version_info.major}.{version_info.minor}{version_info.micro}'
f' pytz{pytz.__version__}')
Athens=zoneinfo.ZoneInfo('Europe/Athens')
f='%Y-%m-%d %H:%M:%S'
d=[datetime.datetime.strptime('2020-10-25 00:00:00',f),
datetime.datetime.strptime('2020-10-25 23:59:59',f)]
print('naive ',d[1]-d[0])
d=[x.astimezone(Athens) for x in d]
print('zoneinfo',d[1]-d[0])
d=[datetime.datetime.strptime('2020-10-25 00:00:00',f),
datetime.datetime.strptime('2020-10-25 23:59:59',f)]
athens=pytz.timezone('Europe/Athens')
print('pytz as ',d[1].astimezone(athens)-d[0].astimezone(athens))
print('pytz loc',athens.localize(d[1])-athens.localize(d[0]))
Python3.91 pytz2020.4
naive 23:59:59
zoneinfo 23:59:59
pytz as 1 day, 0:59:59
pytz loc 1 day, 0:59:59
기본 시간대 지원은 2020-10-25가 여름철에서 겨울철로 전환되는 날이어서 그날의 기간이 25 시간이라는 사실을 무시하는 것으로 보입니다. 내가 무엇을 놓치고 있습니까?
답변
MrFuppes Dec 03 2020 at 20:11
내 의견의 삽화; tzinfo
ZoneInfo from 으로 설정된 날짜 시간 인식 zoneinfo
은 벽 시간 시간 델타를 반환합니다. pytz.timezone
datetime 을 인식 하여 동일한 작업을 수행하면 절대 시간 timedelta를 얻습니다.
from datetime import datetime
from zoneinfo import ZoneInfo
import pytz
from sys import version_info
print(f'Python {version_info.major}.{version_info.minor}{version_info.micro} pytz {pytz.__version__}')
# Python 3.90 pytz 2020.4
d=[datetime.fromisoformat('2020-10-25 00:00:00'), datetime.fromisoformat('2020-10-25 23:59:59')]
Athens = ZoneInfo('Europe/Athens')
print('wall time diff, zoneinfo:', d[1].replace(tzinfo=Athens)-d[0].replace(tzinfo=Athens))
# wall time diff, zoneinfo: 23:59:59
athens = pytz.timezone('Europe/Athens')
print('absolute time diff, pytz:', athens.localize(d[1])-athens.localize(d[0]))
# absolute time diff, pytz: 1 day, 0:59:59
# to get absolute time delta with zoneinfo:
utc = ZoneInfo('UTC')
print('absolute time diff, zoneinfo:', d[1].replace(tzinfo=Athens).astimezone(utc)
-d[0].replace(tzinfo=Athens).astimezone(utc))
# absolute time diff, zoneinfo: 1 day, 0:59:59