Если ваша программа предназначена для работы в разных часовых поясах, а параметр времени оказывает влияние на генерируемые события, то придерживайтесь простого, но очень важного правила:
tz
- Time Zone.UTC - это зона без перехода на летнее время и без каких бы то ни было изменений в прошлом. Из UTC можно конвертировать время в локальное для любого часового пояса.
Дополнительно смотрите модуль zoneinfo
(добавлен в Python 3.9) - конкретная реализация часового пояса для поддержки базы данных часовых поясов IANA.
import datetime tz = datetime.timezone(offset, name=None)
offset
- объект datetime.timedelta()
, смещение от UTC,name=None
- строка, название часового пояса.tz
объектам datetime.datetime()
и datetime.time()
.Класс timezone()
модуля datetime
является подклассом datetime.tzinfo
, каждый экземпляр которого представляет часовой пояс, определенный фиксированным смещением от UTC.
Объекты этого класса не могут использоваться для представления информации о часовом поясе в местах, где разные смещение используются в разные дни года или когда были внесены исторические изменения в гражданское время.
Аргумент смещения offset
должен быть указан как объект datetime.timedelta(), представляющий разницу между местным временем и UTC. Смещение должно быть строго между -timedelta(hours=24)
и timedelta(hours=24)
, в противном случае появиться исключение ValueError
.
Аргумент name
не является обязательным. Если указано, то это должна быть строка, которая будет использоваться в качестве значения, возвращаемого методом datetime.tzname()
.
>>> import datetime >>> offset = datetime.timedelta(hours=3) >>> datetime.timezone(offset, name='МСК') # datetime.timezone(datetime.timedelta(0, 10800), 'МСК')
datetime.timezone()
:tz.utcoffset(dt)
:Метод tz.utcoffset()
возвращает фиксированное значение, указанное при создании экземпляра часового пояса.
Аргумент dt
игнорируется. Возвращаемое значение является экземпляром datetime.timedelta()
, равным разнице между местным временем и UTC.
Смещение UTC не ограничено целым числом минут.
>>> import datetime >>> offset = datetime.timedelta(hours=3) >>> tz = datetime.timezone(offset, name='МСК') >>> dt = datetime.datetime.now() >>> tz.utcoffset(dt) # datetime.timedelta(0, 10800) # или >>> dt = datetime.datetime.now(tz=tz) >>> dt.utcoffset() # datetime.timedelta(0, 10800)
tz.tzname(dt)
:Метод tz.tzname()
возвращает фиксированное значение, указанное при создании экземпляра часового пояса.
Если имя часового пояса name
при создании экземпляра не указано, то имя, возвращаемое tzname(dt)
, генерируется из значения смещения следующим образом. Если смещение равно timedelta(0)
, то имя - UTC
, в противном случае это строка в формате UTC±HH:MM
, где ±
- это знак смещения, HH
и MM
- это две цифры offset.hours
и offset.minutes
соответственно.
>>> import datetime >>> offset = datetime.timedelta(hours=3) >>> tz = datetime.timezone(offset, name='МСК') >>> dt = datetime.datetime.now() >>> tz.tzname(dt) # 'МСК' # или >>> dt = datetime.datetime.now(tz=tz) >>> dt.tzname() # 'МСК'
tz.dst(dt)
:Метод tz.dst()
всегда возвращает None
.
tz.fromutc(dt)
:Метод tz.fromutc()
возвращает dt + offset
. Аргумент dt
должен быть "осведомленным" экземпляром datetime.datetime()
с tzinfo
, установленным в self
.
datetime.timezone()
:tz.utc
:Атрибут tz.utc()
возвращает часовой пояс UTC, эквивалентно datetime.timezone(datetime.timedelta(0))
.
>>> import datetime >>> datetime.timezone(datetime.timedelta(0)) # datetime.timezone.utc