Почему смещение часовых поясов в django отличается?

Django 3.2.10, Python 3.9

settings.py

TIME_ZONE = 'Europe/Moscow'

script.py

from django.utils import timezone


tzinfo = timezone.localtime().tzinfo  # <class 'pytz.tzfile.Europe/Moscow'>
tz = timezone.get_current_timezone()  # <class 'pytz.tzfile.Europe/Moscow'>
dtz = timezone.get_default_timezone() # <class 'pytz.tzfile.Europe/Moscow'>

datetime_object = timezone.now()

print(datetime_object)                         # 2022-03-29 03:34:42.244830+00:00
print(datetime_object.replace(tzinfo=tzinfo))  # 2022-03-29 03:34:42.244830+03:00
print(datetime_object.replace(tzinfo=tz))      # 2022-03-29 03:34:42.244830+02:30
print(datetime_object.replace(tzinfo=dtz))     # 2022-03-29 03:34:42.244830+02:30

+0230 не +0300, а правильное смещение для этого часового пояса - +0300.

Использование tzinfo при построении временных интервалов с учетом временных зон является (как я слышал) плохой практикой и может привести к ошибкам.

With

`TIME_ZONE = 'Europe/Moscow'

вам следует использовать make_aware:

from django.utils import timezone
from datetime import datetime, time

local_now = timezone.localtime()

time_on_the_clock = time(5, 2)
timezone_aware_time = timezone.make_aware(datetime.combine(local_now, time_on_the_clock))

print(timezone_aware_time)

или используя pytz:

from datetime import datetime
from pytz import timezone

datetime_object = datetime.now()
moscow_time = timezone('Europe/Moscow').localize(datetime_object, is_dst=None)

print(moscow_time)
Вернуться на верх