datetime.md
1> **Источник:** https://python-all.ru/3.16/library/datetime.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `datetime` – Основные типы даты и времени89**Исходный код:** [Lib/datetime.py](https://python-all.ru/src/main/Lib/datetime.py)1011---1213Модуль `datetime` предоставляет классы для работы с датами и временем.1415Хотя арифметика дат и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования и обработки вывода.1617> **Совет**18>19> Перейти к [кодам форматирования](https://python-all.ru/3.16/library/datetime.html#format-codes).2021> **См. также**22>23> **Модуль [`calendar`](https://python-all.ru/3.16/library/calendar.html#module-calendar)**24>25> Общие функции, связанные с календарём.26>27> **Модуль [`time`](https://python-all.ru/3.16/library/time.html#module-time)**28>29> Доступ к времени и преобразования.30>31> **Модуль [`zoneinfo`](https://python-all.ru/3.16/library/zoneinfo.html#module-zoneinfo)**32>33> Конкретные часовые пояса, представляющие базу данных часовых поясов IANA.34>35> **Пакет [dateutil](https://python-all.ru/3.16/library/datetime.html)**36>37> Сторонняя библиотека с расширенной поддержкой часовых поясов и разбора.38>39> **Пакет [DateType](https://python-all.ru/3.16/library/datetime.html)**40>41> Сторонняя библиотека, которая вводит отдельные статические типы, чтобы, например, позволить [статическим проверкам типов](https://python-all.ru/3.16/glossary.html#term-static-type-checker) различать наивные и осведомлённые объекты datetime.4243## Осведомлённые и наивные объекты4445Объекты даты и времени могут быть отнесены к категории «осведомлённых» или «наивных» в зависимости от того, содержат ли они информацию о часовом поясе.4647При достаточном знании применимых алгоритмических и политических поправок времени, таких как информация о часовом поясе и переходе на летнее время, **осведомлённый** объект может определить своё положение относительно других осведомлённых объектов. Осведомлённый объект представляет конкретный момент времени, не допускающий неоднозначного толкования. [\[1\]](https://python-all.ru/3.16/library/datetime.html#id4)4849**Наивный** объект не содержит достаточно информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Представляет ли наивный объект Всемирное координированное время (UTC), местное время или время в другом часовом поясе – это полностью зависит от программы, так же как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты легко понять и использовать, ценой игнорирования некоторых аспектов реальности.5051Для приложений, требующих осведомлённых объектов, объекты [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) имеют необязательный атрибут информации о часовом поясе `tzinfo`, который может быть установлен в экземпляр подкласса абстрактного класса `tzinfo`. Эти объекты [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) содержат информацию о смещении от UTC, названии часового пояса и о том, действует ли летнее время.5253Только один конкретный класс [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), класс [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone), предоставляется модулем `datetime`. Класс `timezone` может представлять простые часовые пояса с фиксированным смещением от UTC, такие как сам UTC или часовые пояса североамериканских EST и EDT. Поддержка часовых поясов с более глубоким уровнем детализации оставляется на усмотрение приложения. Правила корректировки времени в мире более политизированы, чем рациональны, часто меняются, и не существует стандарта, подходящего для всех приложений, кроме UTC.5455## Константы5657Модуль `datetime` экспортирует следующие константы:5859#### `datetime.MINYEAR`6061Наименьший номер года, допустимый в объекте [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime). [`MINYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MINYEAR) равен 1.6263#### `datetime.MAXYEAR`6465Наибольший номер года, допустимый в объекте [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime). [`MAXYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MAXYEAR) равен 9999.6667#### `datetime.UTC`6869Псевдоним для синглтона часового пояса UTC [`datetime.timezone.utc`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone.utc).7071Добавлено в версии 3.12.7273## Доступные типы7475#### `class datetime.date`7677Идеализированная наивная дата, предполагающая, что текущий григорианский календарь действовал всегда и будет действовать всегда. Атрибуты: [`year`](https://python-all.ru/3.16/library/datetime.html#datetime.date.year), [`month`](https://python-all.ru/3.16/library/datetime.html#datetime.date.month) и [`day`](https://python-all.ru/3.16/library/datetime.html#datetime.date.day).7879#### `class datetime.time`8081Идеализированное время, независимое от какого-либо конкретного дня, предполагающее, что каждый день содержит ровно 24\*60\*60 секунд. (Здесь нет понятия «високосные секунды».) Атрибуты: [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.time.hour), [`minute`](https://python-all.ru/3.16/library/datetime.html#datetime.time.minute), [`second`](https://python-all.ru/3.16/library/datetime.html#datetime.time.second), [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.time.microsecond) и [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.time.tzinfo).8283#### `class datetime.datetime`8485Комбинация даты и времени. Атрибуты: [`year`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.year), [`month`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.month), [`day`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.day), [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.hour), [`minute`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.minute), [`second`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.second), [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.microsecond), и [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo).8687#### `class datetime.timedelta`8889Длительность, представляющая разницу между двумя экземплярами [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) или [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) с точностью до микросекунды.9091#### `class datetime.tzinfo`9293Абстрактный базовый класс для объектов информации о часовых поясах. Они используются классами [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) для предоставления настраиваемого понятия коррекции времени (например, для учёта часового пояса и/или летнего времени).9495#### `class datetime.timezone`9697Класс, реализующий абстрактный базовый класс [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) в виде фиксированного смещения от UTC.9899Добавлено в версии 3.2.100101Объекты этих типов неизменяемы.102103Отношения подклассов:104105106107### Общие свойства108109Типы [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) и [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone) имеют следующие общие особенности:110111- Объекты этих типов неизменяемы.112- Объекты этих типов являются [хешируемыми](https://python-all.ru/3.16/glossary.html#term-hashable), то есть могут использоваться в качестве ключей словаря.113- Объекты этих типов поддерживают эффективную сериализацию с помощью модуля [`pickle`](https://python-all.ru/3.16/library/pickle.html#module-pickle).114115### Определение, является ли объект aware или naive116117Объекты типа [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) всегда naive.118119Объект типа [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) может быть aware или naive.120121Объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) `d` является aware, если выполняются оба следующих условия:1221231. `d.tzinfo` не является `None`1242. `d.tzinfo.utcoffset(d)` не возвращает `None`125126В противном случае `d` является naive.127128Объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) `t` является aware, если выполняются оба следующих условия:1291301. `t.tzinfo` не является `None`1312. `t.tzinfo.utcoffset(None)` не возвращает `None`.132133В противном случае `t` является naive.134135Различие между aware и naive не применимо к объектам [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) .136137## `timedelta` объекты138139Объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) представляет длительность, разницу между двумя экземплярами [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) или [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date).140141#### `class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)`142143Все аргументы необязательны и по умолчанию равны 0. Аргументы могут быть целыми числами или числами с плавающей запятой, а также могут быть положительными или отрицательными.144145Внутри хранятся только *days*, *seconds* и *microseconds*. Аргументы преобразуются в эти единицы:146147- Миллисекунда преобразуется в 1000 микросекунд.148- Минута преобразуется в 60 секунд.149- Час преобразуется в 3600 секунд.150- Неделя преобразуется в 7 дней.151152а затем дни, секунды и микросекунды нормализуются так, что представление уникально, с153154- `0 <= microseconds < 1000000`155- `0 <= seconds < 3600*24` (количество секунд в одном дне)156- `-999999999 <= days <= 999999999`157158Следующий пример показывает, как любые аргументы, кроме *days*, *seconds* и *microseconds*, «объединяются» и нормализуются в эти три результирующих атрибута:159160```python161>>> import datetime as dt162>>> delta = dt.timedelta(163... days=50,164... seconds=27,165... microseconds=10,166... milliseconds=29000,167... minutes=5,168... hours=8,169... weeks=2170... )171>>> # Остаются только дни, секунды и микросекунды172>>> delta173datetime.timedelta(days=64, seconds=29156, microseconds=10)174```175176> **Совет**177>178> `import datetime as dt` вместо `import datetime` или `from datetime import datetime`, чтобы избежать путаницы между модулем и классом. См. [Как я импортирую модуль datetime в Python](https://python-all.ru/3.16/library/datetime.html).179180Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, то дробные микросекунды, оставшиеся от всех аргументов, объединяются, и их сумма округляется до ближайшей микросекунды с использованием правила округления до ближайшего чётного. Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).181182Если нормализованное значение дней выходит за указанный диапазон, возбуждается [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError).183184Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например:185186```python187>>> import datetime as dt188>>> d = dt.timedelta(microseconds=-1)189>>> (d.days, d.seconds, d.microseconds)190(-1, 86399, 999999)191```192193Поскольку строковое представление объектов `timedelta` может сбивать с толку, используйте следующий рецепт, чтобы получить более читаемый формат:194195```pycon196>>> def pretty_timedelta(td):197... if td.days >= 0:198... return str(td)199... return f'-({-td!s})'200...201>>> d = timedelta(hours=-1)202>>> str(d) # неудобно для человека203'-1 day, 23:00:00'204>>> pretty_timedelta(d)205'-(1:00:00)'206```207208Атрибуты класса:209210#### `timedelta.min`211212Наиболее отрицательный объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta), `timedelta(-999999999)`.213214#### `timedelta.max`215216Наиболее положительный объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta), `timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)`.217218#### `timedelta.resolution`219220Наименьшая возможная разница между неравными [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) объектами, `timedelta(microseconds=1)`.221222Обратите внимание, что из-за нормализации `timedelta.max` больше, чем `-timedelta.min`. `-timedelta.max` не представим как объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta).223224Атрибуты экземпляра (только для чтения):225226#### `timedelta.days`227228От -999,999,999 до 999,999,999 включительно.229230#### `timedelta.seconds`231232От 0 до 86,399 включительно.233234> **Внимание**235>236> Это довольно распространённая ошибка, когда код непреднамеренно использует этот атрибут, хотя на самом деле предполагается получить значение [`total_seconds()`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta.total_seconds) вместо этого:237>238> ```pycon239> >>> import datetime as dt240> >>> duration = dt.timedelta(seconds=11235813)241> >>> duration.days, duration.seconds242> (130, 3813)243> >>> duration.total_seconds()244> 11235813.0245> ```246247#### `timedelta.microseconds`248249От 0 до 999,999 включительно.250251Поддерживаемые операции:252253| Операция | Результат |254| --- | --- |255| `t1 = t2 + t3` | Сумма `t2` и `t3`. После этого `t1 - t2 == t3` и `t1 - t3 == t2` истинны. (1) |256| `t1 = t2 - t3` | Разность `t2` и `t3`. После этого `t1 == t2 - t3` и `t2 == t1 + t3` истинны. (1)(6) |257| `t1 = t2 * i or t1 = i * t2` | Дельта, умноженная на целое число. После этого `t1 // i == t2` истинно, при условии `i != 0`. |258| | В общем случае `t1 * i == t1 * (i-1) + t1` истинно. (1) |259| `t1 = t2 * f or t1 = f * t2` | Дельта, умноженная на число с плавающей запятой. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |260| `f = t2 / t3` | Деление (3) общей длительности `t2` на единицу интервала `t3`. Возвращает объект [`float`](https://python-all.ru/3.16/library/functions.html#float). |261| `t1 = t2 / f or t1 = t2 / i` | Дельта, делённая на число с плавающей запятой или целое число. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |262| `t1 = t2 // i` или `t1 = t2 // t3` | Вычисляется целая часть, а остаток (если он есть) отбрасывается. Во втором случае возвращается целое число. (3) |263| `t1 = t2 % t3` | Остаток вычисляется как объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta). (3) |264| `q, r = divmod(t1, t2)` | Вычисляет частное и остаток: `q = t1 // t2` (3) и `r = t1 % t2`. `q` – целое число, а `r` – объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta). |265| `+t1` | Возвращает объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) с тем же значением. (2) |266| `-t1` | Эквивалентно `timedelta(-t1.days, -t1.seconds, -t1.microseconds)` и `t1 * -1`. (1)(4) |267| `abs(t)` | Эквивалентно `+t`, когда `t.days >= 0`, и `-t`, когда `t.days < 0`. (2) |268| `str(t)` | Возвращает строку вида `[D day[s], ][H]H:MM:SS[.UUUUUU]`, где D отрицательно для отрицательного `t`. (5) |269| `repr(t)` | Возвращает строковое представление объекта [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) в виде вызова конструктора с каноническими значениями атрибутов. |270271Примечания:2722731. Это точное, но может привести к переполнению.2742. Это точное и не может привести к переполнению.2753. Деление на ноль вызывает [`ZeroDivisionError`](https://python-all.ru/3.16/library/exceptions.html#ZeroDivisionError).2764. `-timedelta.max` не представимо в виде объекта [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta).2775. Строковые представления [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) объектов нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных объектов timedelta. Например:278279 ```python280 >>> timedelta(hours=-5)281 datetime.timedelta(days=-1, seconds=68400)282 >>> print(_)283 -1 day, 19:00:00284 ```2856. Выражение `t2 - t3` всегда будет равно выражению `t2 + (-t3)`, за исключением случая, когда t3 равно `timedelta.max`; в этом случае первое выражение даст результат, а второе вызовет переполнение.286287В дополнение к перечисленным выше операциям, объекты [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) поддерживают некоторые операции сложения и вычитания с объектами [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) и [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) (см. ниже).288289Изменено в версии 3.2: Теперь поддерживаются целочисленное деление и истинное деление объекта [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) на другой объект `timedelta`, а также операции взятия остатка и функция [`divmod()`](https://python-all.ru/3.16/library/functions.html#divmod). Также теперь поддерживаются истинное деление и умножение объекта `timedelta` на объект [`float`](https://python-all.ru/3.16/library/functions.html#float).290291Объекты [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) поддерживают сравнение на равенство и упорядочивание.292293В логических контекстах объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) считается истинным тогда и только тогда, когда он не равен `timedelta(0)`.294295Методы экземпляра:296297#### `timedelta.total_seconds()`298299Возвращает общее количество секунд, содержащихся в длительности. Эквивалентно `td / timedelta(seconds=1)`. Для единиц интервала, отличных от секунд, используйте форму деления напрямую (например, `td / timedelta(microseconds=1)`).300301Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет точность до микросекунд.302303Добавлено в версии 3.2.304305### Примеры использования: `timedelta`306307Дополнительный пример нормализации:308309```python310>>> # Компоненты another_year в сумме составляют ровно 365 дней311>>> import datetime as dt312>>> year = dt.timedelta(days=365)313>>> another_year = dt.timedelta(weeks=40, days=84, hours=23,314... minutes=50, seconds=600)315>>> year == another_year316True317>>> year.total_seconds()31831536000.0319```320321Примеры арифметики [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta):322323```python324>>> import datetime as dt325>>> year = dt.timedelta(days=365)326>>> ten_years = 10 * year327>>> ten_years328datetime.timedelta(days=3650)329>>> ten_years.days // 36533010331>>> nine_years = ten_years - year332>>> nine_years333datetime.timedelta(days=3285)334>>> three_years = nine_years // 3335>>> three_years, three_years.days // 365336(datetime.timedelta(days=1095), 3)337```338339## `date` объекты340341Объект [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) представляет дату (год, месяц и день) в идеализированном календаре – текущем григорианском календаре, бесконечно расширенном в обе стороны.3423431 января 1 года называется днём номер 1, 2 января 1 года – днём номер 2 и так далее. [\[2\]](https://python-all.ru/3.16/library/datetime.html#id5)344345#### `class datetime.date(year, month, day)`346347Все аргументы обязательны. Аргументы должны быть целыми числами в следующих диапазонах:348349- `MINYEAR <= year <= MAXYEAR`350- `1 <= month <= 12`351- `1 <= day <= number of days in the given month and year`352353Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).354355Другие конструкторы – все методы класса:356357#### `classmethod date.today()`358359Возвращает текущую локальную дату.360361Это эквивалентно `date.fromtimestamp(time.time())`.362363#### `classmethod date.fromtimestamp(timestamp)`364365Возвращает локальную дату, соответствующую POSIX *timestamp*, такую, как возвращает [`time.time()`](https://python-all.ru/3.16/library/time.html#time.time).366367Это может вызвать [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError), если метка времени находится за пределами диапазона значений, поддерживаемого функцией C `localtime()` платформы, и [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) при ошибке `localtime()`. Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах, не соответствующих POSIX, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются функцией `fromtimestamp()`.368369Изменено в версии 3.3: Вызывает [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемого функцией `localtime()` платформы C. Вызывает [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) вместо `ValueError` при ошибке `localtime()`.370371Изменено в версии 3.15: Принимает любое действительное число в качестве *timestamp*, а не только целое или число с плавающей запятой.372373#### `classmethod date.fromordinal(ordinal)`374375Возвращает дату, соответствующую пролептическому григорианскому *ordinal*, где 1 января 1 года имеет порядковый номер 1.376377[`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) вызывается, если только `1 <= ordinal <= date.max.toordinal()`. Для любой даты `d`, `date.fromordinal(d.toordinal()) == d`.378379#### `classmethod date.fromisoformat(date_string)`380381Возвращает [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), соответствующий *date\_string*, заданной в любом допустимом формате ISO 8601, за следующими исключениями:3823831. Даты с пониженной точностью в настоящее время не поддерживаются (`YYYY-MM`, `YYYY`).3842. Расширенные представления дат в настоящее время не поддерживаются (`±YYYYYY-MM-DD`).3853. Порядковые даты в настоящее время не поддерживаются (`YYYY-OOO`).386387Примеры:388389```python390>>> import datetime as dt391>>> dt.date.fromisoformat('2019-12-04')392datetime.date(2019, 12, 4)393>>> dt.date.fromisoformat('20191204')394datetime.date(2019, 12, 4)395>>> dt.date.fromisoformat('2021-W01-1')396datetime.date(2021, 1, 4)397```398399Добавлено в версии 3.7.400401Изменено в версии 3.11: Ранее этот метод поддерживал только формат `YYYY-MM-DD`.402403#### `classmethod date.fromisocalendar(year, week, day)`404405Возвращает [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), соответствующий дате календаря ISO, указанной с помощью *year*, *week* и *day*. Это обратная функция для [`date.isocalendar()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.isocalendar).406407Добавлено в версии 3.8.408409#### `classmethod date.strptime(date_string, format)`410411Возвращает [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), соответствующий *date\_string*, разобранной в соответствии с *format*. Это эквивалентно:412413```python414date(*(time.strptime(date_string, format)[0:3]))415```416417[`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) вызывается, если date\_string и format не могут быть разобраны с помощью [`time.strptime()`](https://python-all.ru/3.16/library/time.html#time.strptime), или если возвращается значение, не являющееся временным кортежем. См. также [поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`date.fromisoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.fromisoformat).418419> **Примечание**420>421> Если *format* указывает день месяца (`%d`) без года, [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) возникает. Это позволяет избежать ошибки, связанной с високосным годом, которая происходит раз в четыре года в коде, пытающемся разобрать только месяц и день, поскольку год по умолчанию, используемый при отсутствии года в формате, не является високосным. Обходной путь – всегда включать год в ваш *format*. При разборе значений *date\_string*, не содержащих года, явно добавьте високосный год перед разбором:422>423> ```pycon424> >>> import datetime as dt425> >>> date_string = "02/29"426> >>> when = dt.date.strptime(f"{date_string};1984", "%m/%d;%Y") # Избегает ошибки високосного года.427> >>> when.strftime("%B %d")428> 'February 29'429> ```430431Добавлено в версии 3.14.432433Атрибуты класса:434435#### `date.min`436437Самая ранняя представимая дата, `date(MINYEAR, 1, 1)`.438439#### `date.max`440441Самая поздняя представимая дата, `date(MAXYEAR, 12, 31)`.442443#### `date.resolution`444445Наименьшая возможная разница между неравными объектами дат, `timedelta(days=1)`.446447Атрибуты экземпляра (только для чтения):448449#### `date.year`450451От [`MINYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MAXYEAR) включительно.452453#### `date.month`454455От 1 до 12 включительно.456457#### `date.day`458459От 1 до количества дней в указанном месяце указанного года.460461Поддерживаемые операции:462463| Операция | Результат |464| --- | --- |465| `date2 = date1 + timedelta` | `date2` будет на `timedelta.days` дней позже `date1`. (1) |466| `date2 = date1 - timedelta` | Вычисляет `date2` так, что `date2 + timedelta == date1`. (2) |467| `timedelta = date1 - date2` | (3) |468| `date1 == date2` `date1 != date2` | Сравнение на равенство. (4) |469| `date1 < date2` `date1 > date2` `date1 <= date2` `date1 >= date2` | Сравнение порядка. (5) |470471Примечания:4724731. *date2* сдвигается вперёд во времени, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. После этого `date2 - date1 == timedelta.days`. `timedelta.seconds` и `timedelta.microseconds` игнорируются. [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError) возбуждается, если `date2.year` оказался бы меньше, чем [`MINYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MINYEAR), или больше, чем [`MAXYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MAXYEAR).4742. `timedelta.seconds` и `timedelta.microseconds` игнорируются.4753. Это точная операция и не может вызвать переполнение. `timedelta.seconds` и `timedelta.microseconds` равны 0, а `date2 + timedelta == date1` после.4764. Объекты [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) равны, если они представляют одну и ту же дату.477478 Объекты `date`, не являющиеся также экземплярами [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), никогда не равны объектам `datetime`, даже если они представляют одну и ту же дату.4795. *date1* считается меньше *date2*, когда *date1* предшествует *date2* во времени. Другими словами, `date1 < date2` тогда и только тогда, когда `date1.toordinal() < date2.toordinal()`.480481 Сравнение порядка между объектом [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), не являющимся также экземпляром [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), и объектом `datetime` возбуждает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError).482483Изменено в версии 3.13: Сравнение между объектом [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) и экземпляром подкласса [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), который не является подклассом `datetime`, больше не преобразует последний в `date`, игнорируя временную часть и часовой пояс. Поведение по умолчанию можно изменить, переопределив специальные методы сравнения в подклассах.484485В булевом контексте все объекты [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) считаются истинными.486487Методы экземпляра:488489#### `date.replace(year=self.year, month=self.month, day=self.day)`490491Возвращает новый объект [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) с теми же значениями, но с обновлёнными указанными параметрами.492493Пример:494495```python496>>> import datetime as dt497>>> d = dt.date(2002, 12, 31)498>>> d.replace(day=26)499datetime.date(2002, 12, 26)500```501502Универсальная функция [`copy.replace()`](https://python-all.ru/3.16/library/copy.html#copy.replace) также поддерживает объекты [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date).503504#### `date.timetuple()`505506Возвращает [`time.struct_time`](https://python-all.ru/3.16/library/time.html#time.struct_time) такой, какой возвращается [`time.localtime()`](https://python-all.ru/3.16/library/time.html#time.localtime).507508Часы, минуты и секунды равны 0, а флаг DST равен -1.509510`d.timetuple()` эквивалентно:511512```python513time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))514```515516где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – это номер дня в текущем году, начиная с 1 для 1 января.517518#### `date.toordinal()`519520Возвращает пролептический григорианский порядковый номер даты, где 1 января 1 года имеет порядковый номер 1. Для любого объекта [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) `d`, `date.fromordinal(d.toordinal()) == d`.521522#### `date.weekday()`523524Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. Например, `date(2002, 12, 4).weekday() == 2`, среда. См. также [`isoweekday()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.isoweekday).525526#### `date.isoweekday()`527528Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. Например, `date(2002, 12, 4).isoweekday() == 3`, среда. См. также [`weekday()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.weekday), [`isocalendar()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.isocalendar).529530#### `date.isocalendar()`531532Возвращает объект [именованный кортеж](https://python-all.ru/3.16/glossary.html#term-named-tuple) с тремя компонентами: `year`, `week` и `weekday`.533534Календарь ISO – широко используемый вариант григорианского календаря. [\[3\]](https://python-all.ru/3.16/library/datetime.html#id6)535536Год ISO состоит из 52 или 53 полных недель, причём неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя года ISO – это первая (григорианская) календарная неделя года, в которую входит четверг. Она называется неделей номер 1, и год ISO этого четверга совпадает с его григорианским годом.537538Например, 2004 год начинается в четверг, поэтому первая неделя года ISO 2004 начинается в понедельник, 29 декабря 2003 г., и заканчивается в воскресенье, 4 января 2004 г.:539540```python541>>> import datetime as dt542>>> dt.date(2003, 12, 29).isocalendar()543datetime.IsoCalendarDate(year=2004, week=1, weekday=1)544>>> dt.date(2004, 1, 4).isocalendar()545datetime.IsoCalendarDate(year=2004, week=1, weekday=7)546```547548Изменено в версии 3.9: Результат изменён с кортежа на [именованный кортеж](https://python-all.ru/3.16/glossary.html#term-named-tuple).549550#### `date.isoformat()`551552Возвращает строку, представляющую дату в формате ISO 8601, `YYYY-MM-DD`:553554```python555>>> import datetime as dt556>>> dt.date(2002, 12, 4).isoformat()557'2002-12-04'558```559560#### `date.__str__()`561562Для даты `d` `str(d)` эквивалентно `d.isoformat()`.563564#### `date.ctime()`565566Возвращает строку, представляющую дату:567568```python569>>> import datetime as dt570>>> dt.date(2002, 12, 4).ctime()571'Wed Dec 4 00:00:00 2002'572```573574`d.ctime()` эквивалентно:575576```python577time.ctime(time.mktime(d.timetuple()))578```579580на платформах, где нативная функция C `ctime()` (которую вызывает [`time.ctime()`](https://python-all.ru/3.16/library/time.html#time.ctime), но которую `date.ctime()` не вызывает) соответствует стандарту C.581582#### `date.strftime(format)`583584Возвращает строку, представляющую дату, управляемую явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. См. также [поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`date.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.isoformat).585586#### `date.__format__(format)`587588То же, что [`date.strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.strftime). Это позволяет задавать строку форматирования для объекта [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) в [форматированных строковых литералах](https://python-all.ru/3.16/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format). См. также [Поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`date.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.isoformat).589590### Примеры использования: `date`591592Пример подсчёта дней до события:593594```python595>>> import time596>>> import datetime as dt597>>> today = dt.date.today()598>>> today599datetime.date(2007, 12, 5)600>>> today == dt.date.fromtimestamp(time.time())601True602>>> my_birthday = dt.date(today.year, 6, 24)603>>> if my_birthday < today:604... my_birthday = my_birthday.replace(year=today.year + 1)605...606>>> my_birthday607datetime.date(2008, 6, 24)608>>> time_to_birthday = abs(my_birthday - today)609>>> time_to_birthday.days610202611```612613Другие примеры работы с [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date):614615```pycon616>>> import datetime as dt617>>> d = dt.date.fromordinal(730920) # 730920-й день после 1.1.0001618>>> d619datetime.date(2002, 3, 11)620621>>> # Методы, связанные с форматированием строкового вывода622>>> d.isoformat()623'2002-03-11'624>>> d.strftime("%d/%m/%y")625'11/03/02'626>>> d.strftime("%A %d. %B %Y")627'Monday 11. March 2002'628>>> d.ctime()629'Mon Mar 11 00:00:00 2002'630>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")631'The day is 11, the month is March.'632633>>> # Методы для извлечения «компонентов» в разных календарях634>>> t = d.timetuple()635>>> for i in t:636... print(i)6372002 # year6383 # month63911 # day6400641064206430 # weekday (0 = Monday)64470 # 70th day in the year645-1646>>> ic = d.isocalendar()647>>> for i in ic:648... print(i)6492002 # ISO year65011 # ISO week number6511 # ISO day number ( 1 = Monday )652653>>> # Объект date является неизменяемым; все операции создают новый объект654>>> d.replace(year=2005)655datetime.date(2005, 3, 11)656```657658## `datetime` объекты659660Объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) – это единый объект, содержащий всю информацию из объекта [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) и объекта [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time).661662Как и объект [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) предполагает текущий григорианский календарь, расширенный в обе стороны; как и объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time), `datetime` предполагает, что в каждом дне ровно 3600\*24 секунд.663664Конструктор:665666#### `class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)`667668Аргументы *year*, *month* и *day* обязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo). Остальные аргументы должны быть целыми числами в следующих диапазонах:669670- `MINYEAR <= year <= MAXYEAR`,671- `1 <= month <= 12`,672- `1 <= day <= number of days in the given month and year`,673- `0 <= hour < 24`,674- `0 <= minute < 60`,675- `0 <= second < 60`,676- `0 <= microsecond < 1000000`,677- `fold in [0, 1]`.678679Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).680681Изменено в версии 3.6: Добавлен параметр *fold*.682683Другие конструкторы – все методы класса:684685#### `classmethod datetime.today()`686687Возвращает текущие локальные дату и время, с [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) `None`.688689Эквивалентно следующему:690691```python692datetime.fromtimestamp(time.time())693```694695См. также [`now()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.now), [`fromtimestamp()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fromtimestamp).696697Этот метод функционально эквивалентен [`now()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.now), но без параметра `tz`.698699#### `classmethod datetime.now(tz=None)`700701Возвращает текущие локальные дату и время.702703Если необязательный аргумент *tz* равен `None` или не указан, это аналогично [`today()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.today), но, по возможности, обеспечивает большую точность, чем можно получить через метку времени [`time.time()`](https://python-all.ru/3.16/library/time.html#time.time) (например, это возможно на платформах, предоставляющих функцию C `gettimeofday()`).704705Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), а текущие дата и время преобразуются в часовой пояс *tz*.706707Эта функция предпочтительнее [`today()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.today) и [`utcnow()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.utcnow).708709> **Примечание**710>711> Последующие вызовы `datetime.now()` могут возвращать один и тот же момент времени в зависимости от точности базовых часов.712713#### `classmethod datetime.utcnow()`714715Возвращает текущие дату и время UTC, с [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) `None`.716717Это похоже на [`now()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.now), но возвращает текущие дату и время UTC в виде наивного объекта [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime). Осведомлённый объект текущего времени UTC можно получить, вызвав `datetime.now(timezone.utc)`. См. также `now()`.718719> **Предупреждение**720>721> Поскольку наивные объекты `datetime` многими методами `datetime` рассматриваются как местное время, для представления времени в UTC предпочтительнее использовать осведомлённые объекты datetime. Поэтому рекомендуемый способ создания объекта, представляющего текущее время в UTC, – вызов `datetime.now(timezone.utc)`.722723Устарело с версии 3.12: Вместо этого используйте [`datetime.now()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.now) с [`UTC`](https://python-all.ru/3.16/library/datetime.html#datetime.UTC).724725#### `classmethod datetime.fromtimestamp(timestamp, tz=None)`726727Возвращает локальные дату и время, соответствующие метке времени POSIX, такой как возвращается [`time.time()`](https://python-all.ru/3.16/library/time.html#time.time). Если необязательный аргумент *tz* равен `None` или не указан, метка времени преобразуется в локальные дату и время платформы, и возвращаемый объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) является наивным.728729Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), и метка времени преобразуется в часовой пояс *tz*.730731`fromtimestamp()` может возбуждать [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError), если метка времени выходит за диапазон значений, поддерживаемых платформенными функциями C `localtime()` или `gmtime()`, и [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) при ошибке `localtime()` или `gmtime()`. Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что на системах, не совместимых с POSIX, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются `fromtimestamp()`, и поэтому возможно иметь две метки времени, различающиеся на секунду, которые дают идентичные объекты [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime). Этот метод предпочтительнее [`utcfromtimestamp()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.utcfromtimestamp).732733Изменено в версии 3.3: Возбуждает [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), если метка времени выходит за диапазон значений, поддерживаемых платформенными функциями C `localtime()` или `gmtime()`. Возбуждает [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) вместо `ValueError` при ошибке `localtime()` или `gmtime()`.734735Изменено в версии 3.6: `fromtimestamp()` может возвращать экземпляры с [`fold`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fold), установленным в 1.736737Изменено в версии 3.15: Принимает любое действительное число в качестве *timestamp*, а не только целое или число с плавающей запятой.738739#### `classmethod datetime.utcfromtimestamp(timestamp)`740741Возвращает [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) UTC, соответствующий метке времени POSIX, с [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) `None`. (Результирующий объект является наивным.)742743Это может возбуждать [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError), если метка времени выходит за диапазон значений, поддерживаемых платформенной функцией C `gmtime()`, и [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) при ошибке `gmtime()`. Обычно это ограничено годами с 1970 по 2038.744745Чтобы получить осведомлённый объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), вызовите [`fromtimestamp()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fromtimestamp):746747```python748datetime.fromtimestamp(timestamp, timezone.utc)749```750751На платформах, совместимых с POSIX, это эквивалентно следующему выражению:752753```python754datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)755```756757за исключением того, что последняя формула всегда поддерживает полный диапазон лет: от [`MINYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MAXYEAR) включительно.758759> **Предупреждение**760>761> Поскольку наивные объекты `datetime` во многих методах `datetime` трактуются как местное время, для представления времени в UTC предпочтительнее использовать aware-даты. Поэтому рекомендуемый способ создания объекта для конкретной метки времени в UTC – вызов `datetime.fromtimestamp(timestamp, tz=timezone.utc)`.762763Изменено в версии 3.3: Вызывает [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемого функцией `gmtime()` платформы C. Вызывает [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) вместо `ValueError` при ошибке `gmtime()`.764765Изменено в версии 3.15: Принимает любое действительное число в качестве *timestamp*, а не только целое или число с плавающей запятой.766767Устарело с версии 3.12: Вместо этого используйте [`datetime.fromtimestamp()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fromtimestamp) с [`UTC`](https://python-all.ru/3.16/library/datetime.html#datetime.UTC).768769#### `classmethod datetime.fromordinal(ordinal)`770771Возвращает [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1. [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) вызывается, если не выполнено `1 <= ordinal <= datetime.max.toordinal()`. Час, минута, секунда и микросекунда результата равны 0, а [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) равен `None`.772773#### `classmethod datetime.combine(date, time, tzinfo=time.tzinfo)`774775Возвращает новый объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), компоненты даты которого равны компонентам заданного объекта [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), а компоненты времени равны компонентам заданного объекта [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time). Если указан аргумент *tzinfo*, его значение используется для установки атрибута [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) результата, в противном случае используется атрибут [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.time.tzinfo) аргумента *time*. Если аргумент *date* является объектом `datetime`, его компоненты времени и атрибуты `tzinfo` игнорируются.776777Для любого объекта [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) `d`, `d == datetime.combine(d.date(), d.time(), d.tzinfo)`.778779Изменено в версии 3.6: Добавлен аргумент *tzinfo*.780781#### `classmethod datetime.fromisoformat(date_string)`782783Возвращает [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), соответствующий строке *date\_string* в любом допустимом формате ISO 8601, за следующими исключениями:7847851. Смещения часовых поясов могут содержать доли секунды.7862. Разделитель `T` может быть заменён любым отдельным символом Unicode.7873. Доли часов и минут не поддерживаются.7884. Даты с пониженной точностью в настоящее время не поддерживаются (`YYYY-MM`, `YYYY`).7895. Расширенные представления дат в настоящее время не поддерживаются (`±YYYYYY-MM-DD`).7906. Порядковые даты в настоящее время не поддерживаются (`YYYY-OOO`).791792Примеры:793794```python795>>> import datetime as dt796>>> dt.datetime.fromisoformat('2011-11-04')797datetime.datetime(2011, 11, 4, 0, 0)798>>> dt.datetime.fromisoformat('20111104')799datetime.datetime(2011, 11, 4, 0, 0)800>>> dt.datetime.fromisoformat('2011-11-04T00:05:23')801datetime.datetime(2011, 11, 4, 0, 5, 23)802>>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z')803datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)804>>> dt.datetime.fromisoformat('20111104T000523')805datetime.datetime(2011, 11, 4, 0, 5, 23)806>>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283')807datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)808>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283')809datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)810>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')811datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)812>>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00')813datetime.datetime(2011, 11, 4, 0, 5, 23,814 tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))815```816817Добавлено в версии 3.7.818819Изменено в версии 3.11: Ранее этот метод поддерживал только форматы, которые могли быть созданы с помощью [`date.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.isoformat) или [`datetime.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.isoformat).820821#### `classmethod datetime.fromisocalendar(year, week, day)`822823Возвращает [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), соответствующий дате по ISO-календарю, заданной *year*, *week* и *day*. Компоненты datetime, не связанные с датой, заполняются обычными значениями по умолчанию. Это обратная функция от [`datetime.isocalendar()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.isocalendar).824825Добавлено в версии 3.8.826827#### `classmethod datetime.strptime(date_string, format)`828829Возвращает объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), соответствующий *date\_string*, разобранный в соответствии с *format*.830831Если *format* не содержит микросекунд или информации о часовом поясе, это эквивалентно:832833```python834datetime(*(time.strptime(date_string, format)[0:6]))835```836837[`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) вызывается, если date\_string и format не могут быть разобраны с помощью [`time.strptime()`](https://python-all.ru/3.16/library/time.html#time.strptime), или если возвращается значение, не являющееся временным кортежем. См. также [поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`datetime.fromisoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fromisoformat).838839Изменено в версии 3.15: Если *format* задаёт день месяца (`%d`) без указания года, вызывается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Это предотвращает ошибку из-за разницы високосных годов, проявляющуюся раз в четыре года: код, разбирающий только месяц и день, использует по умолчанию невисокосный год, так как год в формате не указан. Обходной путь – всегда указывать год в *format*. Если разбираются значения *date\_string* без года, перед разбором явно добавьте високосный год:840841```pycon842>>> import datetime as dt843>>> date_string = "02/29"844>>> when = dt.datetime.strptime(f"{date_string};1984", "%m/%d;%Y") # Избегает ошибки високосного года.845>>> when.strftime("%B %d")846'February 29'847```848849Атрибуты класса:850851#### `datetime.min`852853Самое раннее представимое [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), `datetime(MINYEAR, 1, 1, tzinfo=None)`.854855#### `datetime.max`856857Самое позднее представимое [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), `datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)`.858859#### `datetime.resolution`860861Наименьшая возможная разница между неравными [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) объектами, `timedelta(microseconds=1)`.862863Атрибуты экземпляра (только для чтения):864865#### `datetime.year`866867От [`MINYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MAXYEAR) включительно.868869#### `datetime.month`870871От 1 до 12 включительно.872873#### `datetime.day`874875От 1 до количества дней в указанном месяце указанного года.876877#### `datetime.hour`878879В `range(24)`.880881#### `datetime.minute`882883В `range(60)`.884885#### `datetime.second`886887В `range(60)`.888889#### `datetime.microsecond`890891В `range(1000000)`.892893#### `datetime.tzinfo`894895Объект, переданный в качестве аргумента *tzinfo* конструктору [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), или `None`, если ничего не было передано.896897#### `datetime.fold`898899В `[0, 1]`. Используется для устранения неоднозначности поясного времени в повторяющемся интервале. (Повторяющийся интервал возникает, когда часы переводятся назад в конце перехода на летнее время или когда смещение UTC для текущего часового пояса уменьшается по политическим причинам.) Значения 0 и 1 представляют соответственно более ранний и более поздний из двух моментов с одинаковым представлением поясного времени.900901Добавлено в версии 3.6.902903Поддерживаемые операции:904905| Операция | Результат |906| --- | --- |907| `datetime2 = datetime1 + timedelta` | (1) |908| `datetime2 = datetime1 - timedelta` | (2) |909| `timedelta = datetime1 - datetime2` | (3) |910| `datetime1 == datetime2` `datetime1 != datetime2` | Сравнение на равенство. (4) |911| `datetime1 < datetime2` `datetime1 > datetime2` `datetime1 <= datetime2` `datetime1 >= datetime2` | Сравнение порядка. (5) |9129131. `datetime2` – это длительность `timedelta`, вычитаемая из `datetime1`, сдвигающая время вперёд, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. Результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo), что и исходный datetime, и `datetime2 - datetime1 == timedelta` после. [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError) возникает, если `datetime2.year` окажется меньше [`MINYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.16/library/datetime.html#datetime.MAXYEAR). Обратите внимание, что корректировка часового пояса не выполняется, даже если исходный объект осведомлён.9142. Вычисляет `datetime2`, такой что `datetime2 + timedelta == datetime1`. Как и при сложении, результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo), что и исходный datetime, и корректировка часового пояса не выполняется, даже если исходный объект осведомлён.9153. Вычитание [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) из `datetime` определено только если оба операнда наивны или оба осведомлены. Если один осведомлён, а другой наивен, возникает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError).916917 Если оба наивны, или оба осведомлены и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo), атрибуты `tzinfo` игнорируются, и результатом является объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) `t`, такой что `datetime2 + t == datetime1`. В этом случае корректировка часового пояса не выполняется.918919 Если оба осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo), `a-b` действует так, как если бы `a` и `b` были сначала преобразованы в наивные объекты datetime в UTC. Результат – `(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`, за исключением того, что в реализации никогда не возникает переполнения.9204. Объекты [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) равны, если они представляют одну и ту же дату и время с учётом часового пояса.921922 Наивные и осознающие объекты [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) никогда не равны.923924 Если оба операнда осознающие и имеют одинаковый атрибут `tzinfo`, атрибуты `tzinfo` и [`fold`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fold) игнорируются, и сравниваются базовые даты и время. Если оба операнда осознающие и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo), сравнение ведётся так, как если бы операнды сначала были преобразованы в даты и время в UTC, за исключением того, что реализация никогда не вызывает переполнение. Экземпляры [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) в повторяющемся интервале никогда не равны экземплярам `datetime` в другом часовом поясе.9255. *datetime1* считается меньше *datetime2*, когда *datetime1* предшествует *datetime2* во времени с учётом часового пояса.926927 Операция сравнения порядка между наивными и осознающими объектами [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) вызывает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError).928929 Если оба операнда осознающие и имеют одинаковый атрибут `tzinfo`, атрибуты `tzinfo` и [`fold`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fold) игнорируются, и сравниваются базовые даты и время. Если оба операнда осознающие и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo), сравнение ведётся так, как если бы операнды сначала были преобразованы в даты и время в UTC, за исключением того, что реализация никогда не вызывает переполнение.930931Изменено в версии 3.3: Сравнения на равенство между осознающими и наивными экземплярами [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) не вызывают [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError).932933Изменено в версии 3.13: Сравнение между объектом [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) и экземпляром подкласса [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), который не является подклассом `datetime`, больше не преобразует последний в `date`, игнорируя временную часть и часовой пояс. Поведение по умолчанию можно изменить, переопределив специальные методы сравнения в подклассах.934935Методы экземпляра:936937#### `datetime.date()`938939Возвращает объект [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) с тем же годом, месяцем и днём.940941#### `datetime.time()`942943Возвращает объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) с теми же часами, минутами, секундами, микросекундами и fold. [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) равно `None`. См. также метод [`timetz()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.timetz).944945Изменено в версии 3.6: Значение fold копируется в возвращаемый объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time).946947#### `datetime.timetz()`948949Возвращает объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) с теми же атрибутами hour, minute, second, microsecond, fold и tzinfo. См. также метод [`time()`](https://python-all.ru/3.16/library/time.html#module-time).950951Изменено в версии 3.6: Значение fold копируется в возвращаемый объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time).952953#### `datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)`954955Возвращает новый объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#module-datetime) с теми же атрибутами, но с обновлёнными указанными параметрами. Обратите внимание, что `tzinfo=None` можно указать, чтобы создать наивный datetime из осознающего без преобразования данных даты и времени.956957Объекты [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) также поддерживаются обобщённой функцией [`copy.replace()`](https://python-all.ru/3.16/library/copy.html#copy.replace).958959Изменено в версии 3.6: Добавлен параметр *fold*.960961#### `datetime.astimezone(tz=None)`962963Возвращает объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) с новым атрибутом [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) *tz*, корректируя данные даты и времени так, чтобы результат соответствовал тому же времени UTC, что и *self*, но в местном времени *tz*.964965Если *tz* указан, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), а его методы [`utcoffset()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.utcoffset) и [`dst()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.dst) не должны возвращать `None`. Если *self* наивный, предполагается, что он представляет время в системном часовом поясе.966967Если вызывается без аргументов (или с `tz=None`), для целевого часового пояса используется системный местный часовой пояс. Атрибут `.tzinfo` преобразованного экземпляра datetime будет установлен в экземпляр [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone) с именем зоны и смещением, полученными от ОС.968969Если `self.tzinfo` равно *tz*, `self.astimezone(tz)` равно *self*: корректировка данных даты или времени не выполняется. В противном случае результат – местное время в часовом поясе *tz*, представляющее то же время UTC, что и *self*: после `astz = dt.astimezone(tz)` `astz - astz.utcoffset()` будут содержать те же данные даты и времени, что и `dt - dt.utcoffset()`.970971Если нужно просто прикрепить объект [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone) *tz* к datetime *dt* без корректировки данных даты и времени, используйте `dt.replace(tzinfo=tz)`. Если нужно просто удалить объект `timezone` из осознающего datetime *dt* без преобразования данных даты и времени, используйте `dt.replace(tzinfo=None)`.972973Обратите внимание, что метод по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo.fromutc) можно переопределить в подклассе [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), чтобы повлиять на результат, возвращаемый `astimezone()`. Если не учитывать ошибки, `astimezone()` работает следующим образом:974975```python976def astimezone(self, tz):977 if self.tzinfo is tz:978 return self979 # Преобразует self в UTC и присоединяет новый объект часового пояса.980 utc = (self - self.utcoffset()).replace(tzinfo=tz)981 # Преобразует из UTC в местное время tz.982 return tz.fromutc(utc)983```984985Изменено в версии 3.3: *tz* теперь можно опускать.986987Изменено в версии 3.6: Метод `astimezone()` теперь можно вызывать для наивных экземпляров, которые считаются представляющими системное местное время.988989#### `datetime.utcoffset()`990991Если [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(self)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) с величиной менее одного дня.992993Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.994995#### `datetime.dst()`996997Если [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращается `None`, иначе возвращается `self.tzinfo.dst(self)`, и возбуждается исключение, если последний не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) с величиной меньше одного дня.998999Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.10001001#### `datetime.tzname()`10021003Если [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращается `None`, иначе возвращается `self.tzinfo.tzname(self)`, возбуждается исключение, если последний не возвращает `None` или строковый объект,10041005#### `datetime.timetuple()`10061007Возвращает [`time.struct_time`](https://python-all.ru/3.16/library/time.html#time.struct_time) такой, какой возвращается [`time.localtime()`](https://python-all.ru/3.16/library/time.html#time.localtime).10081009`d.timetuple()` эквивалентно:10101011```python1012time.struct_time((d.year, d.month, d.day,1013 d.hour, d.minute, d.second,1014 d.weekday(), yday, dst))1015```10161017где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – номер дня в текущем году, начиная с 1 для 1 января. Флаг [`tm_isdst`](https://python-all.ru/3.16/library/time.html#time.struct_time.tm_isdst) результата устанавливается в соответствии с методом [`dst()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.dst): если [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo) равно `None` или `dst()` возвращает `None`, `tm_isdst` устанавливается в `-1`; иначе, если `dst()` возвращает ненулевое значение, `tm_isdst` устанавливается в 1; иначе `tm_isdst` устанавливается в 0.10181019#### `datetime.utctimetuple()`10201021Если экземпляр [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) `d` наивный, это то же самое, что `d.timetuple()`, за исключением того, что [`tm_isdst`](https://python-all.ru/3.16/library/time.html#time.struct_time.tm_isdst) принудительно устанавливается в 0 независимо от того, что возвращает `d.dst()`. DST никогда не действует для времени UTC.10221023Если `d` осознанный, `d` нормализуется к времени UTC вычитанием `d.utcoffset()`, и возвращается [`time.struct_time`](https://python-all.ru/3.16/library/time.html#time.struct_time) для нормализованного времени. `tm_isdst` принудительно устанавливается в 0. Обратите внимание, что может быть возбуждено [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError), если `d.year` было `MINYEAR` или `MAXYEAR` и корректировка UTC выходит за границу года.10241025> **Предупреждение**1026>1027> Поскольку наивные объекты `datetime` рассматриваются многими методами `datetime` как местное время, предпочтительнее использовать осознанные объекты datetime для представления времени в UTC; как результат, использование `datetime.utctimetuple()` может давать вводящие в заблуждение результаты. Если у вас есть наивный `datetime`, представляющий UTC, используйте `datetime.replace(tzinfo=timezone.utc)`, чтобы сделать его осознанным, после чего можно использовать [`datetime.timetuple()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.timetuple).10281029#### `datetime.toordinal()`10301031Возвращает пролептический григорианский порядковый номер даты. То же, что `self.date().toordinal()`.10321033#### `datetime.timestamp()`10341035Возвращает временную метку POSIX, соответствующую экземпляру [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime). Возвращаемое значение – [`float`](https://python-all.ru/3.16/library/functions.html#float), похожее на то, что возвращается [`time.time()`](https://python-all.ru/3.16/library/time.html#time.time).10361037Naive [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) instances are assumed to represent local time and this method relies on platform C functions to perform the conversion. Since `datetime` supports a wider range of values than the platform C functions on many platforms, this method may raise [`OverflowError`](https://python-all.ru/3.16/library/exceptions.html#OverflowError) or [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) for times far in the past or far in the future.10381039Для осознанных экземпляров [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) возвращаемое значение вычисляется как:10401041```python1042(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()1043```10441045> **Примечание**1046>1047> Нет метода для получения временной метки POSIX непосредственно из наивного экземпляра [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), представляющего время UTC. Если ваше приложение использует это соглашение и часовой пояс вашей системы не установлен на UTC, вы можете получить временную метку POSIX, указав `tzinfo=timezone.utc`:1048>1049> ```python1050> timestamp = dt.replace(tzinfo=timezone.utc).timestamp()1051> ```1052>1053> или вычислив метку напрямую:1054>1055> ```python1056> timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)1057> ```10581059Добавлено в версии 3.3.10601061Изменено в версии 3.6: Метод `timestamp()` использует атрибут [`fold`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fold) для устранения неоднозначности моментов времени в течение повторяющегося интервала.10621063Changed in version 3.6: This method no longer relies on the platform C `mktime()` function to perform conversions.10641065#### `datetime.weekday()`10661067Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. То же, что `self.date().weekday()`. См. также [`isoweekday()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.isoweekday).10681069#### `datetime.isoweekday()`10701071Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. То же, что `self.date().isoweekday()`. См. также [`weekday()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.weekday), [`isocalendar()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.isocalendar).10721073#### `datetime.isocalendar()`10741075Возвращает [именованный кортеж](https://python-all.ru/3.16/glossary.html#term-named-tuple) с тремя компонентами: `year`, `week` и `weekday`. То же, что `self.date().isocalendar()`.10761077#### `datetime.isoformat(sep='T', timespec='auto')`10781079Возвращает строку, представляющую дату и время в формате ISO 8601:10801081- `YYYY-MM-DDTHH:MM:SS.ffffff`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.microsecond) не равно 01082- `YYYY-MM-DDTHH:MM:SS`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.microsecond) равно 010831084Если [`utcoffset()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.utcoffset) не возвращает `None`, добавляется строка с указанием смещения UTC:10851086- `YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.microsecond) не равно 01087- `YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.microsecond) равно 010881089Примеры:10901091```python1092>>> import datetime as dt1093>>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()1094'2019-05-18T15:17:08.132263'1095>>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat()1096'2019-05-18T15:17:00+00:00'1097```10981099Необязательный аргумент *sep* (по умолчанию `'T'`) – это односимвольный разделитель, который ставится между частями даты и времени результата. Например:11001101```python1102>>> import datetime as dt1103>>> class TZ(dt.tzinfo):1104... """Часовой пояс с произвольным постоянным смещением -06:39."""1105... def utcoffset(self, when):1106... return dt.timedelta(hours=-6, minutes=-39)1107...1108>>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')1109'2002-12-25 00:00:00-06:39'1110>>> dt.datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()1111'2009-11-27T00:00:00.000100-06:39'1112```11131114Необязательный аргумент *timespec* указывает количество дополнительных компонентов времени, которые нужно включить (по умолчанию `'auto'`). Он может быть одним из следующих:11151116- `'auto'`: То же, что и `'seconds'`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.microsecond) равно 0, иначе то же, что и `'microseconds'`.1117- `'hours'`: Включает [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.hour) в двухзначном формате `HH`.1118- `'minutes'`: Включает [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.hour) и [`minute`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.minute) в формате `HH:MM`.1119- `'seconds'`: Включает [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.hour), [`minute`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.minute) и [`second`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.second) в формате `HH:MM:SS`.1120- `'milliseconds'`: Включает полное время, но усекает дробную часть секунд до миллисекунд. Формат `HH:MM:SS.sss`.1121- `'microseconds'`: Включает полное время в формате `HH:MM:SS.ffffff`.11221123> **Примечание**1124>1125> Исключённые компоненты времени усекаются, а не округляются.11261127[`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) будет возбуждено при недопустимом значении аргумента *timespec*:11281129```python1130>>> import datetime as dt1131>>> dt.datetime.now().isoformat(timespec='minutes')1132'2002-12-25T00:00'1133>>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0)1134>>> my_datetime.isoformat(timespec='microseconds')1135'2015-01-01T12:30:59.000000'1136```11371138Изменено в версии 3.6: Добавлен параметр *timespec*.11391140#### `datetime.__str__()`11411142Для экземпляра [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) `d` `str(d)` эквивалентно `d.isoformat(' ')`.11431144#### `datetime.ctime()`11451146Возвращает строку, представляющую дату и время:11471148```python1149>>> import datetime as dt1150>>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime()1151'Wed Dec 4 20:30:40 2002'1152```11531154Результирующая строка *не* содержит информацию о часовом поясе независимо от того, является ли исходный объект aware или naive.11551156`d.ctime()` эквивалентно:11571158```python1159time.ctime(time.mktime(d.timetuple()))1160```11611162на платформах, где нативная C-функция `ctime()` (которая вызывается в [`time.ctime()`](https://python-all.ru/3.16/library/time.html#time.ctime), но не вызывается в `datetime.ctime()`) соответствует стандарту C.11631164#### `datetime.strftime(format)`11651166Возвращает строку, представляющую дату и время, с управлением через явную строку форматирования. См. также [Поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`datetime.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.isoformat).11671168#### `datetime.__format__(format)`11691170То же, что [`datetime.strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strftime). Это позволяет задавать строку форматирования для объекта [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) в [форматированных строковых литералах](https://python-all.ru/3.16/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format). См. также [Поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`datetime.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.isoformat).11711172### Примеры использования: `datetime`11731174Примеры работы с объектами [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime):11751176```pycon1177>>> import datetime as dt11781179>>> # Использование datetime.combine()1180>>> d = dt.date(2005, 7, 14)1181>>> t = dt.time(12, 30)1182>>> dt.datetime.combine(d, t)1183datetime.datetime(2005, 7, 14, 12, 30)11841185>>> # Использование datetime.now()1186>>> dt.datetime.now()1187datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +11188>>> dt.datetime.now(dt.timezone.utc)1189datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)11901191>>> # Использование datetime.strptime()1192>>> my_datetime = dt.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")1193>>> my_datetime1194datetime.datetime(2006, 11, 21, 16, 30)11951196>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов1197>>> tt = my_datetime.timetuple()1198>>> for it in tt:1199... print(it)1200...12012006 # year120211 # month120321 # day120416 # hour120530 # minute12060 # second12071 # weekday (0 = Monday)1208325 # number of days since 1st January1209-1 # dst - method tzinfo.dst() returned None12101211>>> # Дата в формате ISO1212>>> ic = my_datetime.isocalendar()1213>>> for it in ic:1214... print(it)1215...12162006 # ISO year121747 # ISO week12182 # ISO weekday12191220>>> # Форматирование datetime1221>>> my_datetime.strftime("%A, %d. %B %Y %I:%M%p")1222'Tuesday, 21. November 2006 04:30PM'1223>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(my_datetime, "day", "month", "time")1224'The day is 21, the month is November, the time is 04:30PM.'1225```12261227В приведённом ниже примере определяется подкласс [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), который фиксирует информацию о часовом поясе для Кабула (Афганистан). До 1945 года там использовалось смещение +4 UTC, а затем +4:30 UTC:12281229```python1230import datetime as dt12311232class KabulTz(dt.tzinfo):1233 # В Кабуле до 1945 года использовали +4, затем перешли на +4:301234 UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)12351236 def utcoffset(self, when):1237 if when.year < 1945:1238 return dt.timedelta(hours=4)1239 elif (1945, 1, 1, 0, 0) <= when.timetuple()[:5] < (1945, 1, 1, 0, 30):1240 # Неоднозначный («мнимый») получасовой диапазон, представляющий1241 # «складку» во времени из-за перехода с +4 на +4:30.1242 # Если when попадает в мнимый диапазон, используйте fold, чтобы решить, как1243 # разрешить неоднозначность. См. PEP 495.1244 return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))1245 else:1246 return dt.timedelta(hours=4, minutes=30)12471248 def fromutc(self, when):1249 # Следуйте тем же проверкам, что и в datetime.tzinfo1250 if not isinstance(when, dt.datetime):1251 raise TypeError("fromutc() requires a datetime argument")1252 if when.tzinfo is not self:1253 raise ValueError("when.tzinfo is not self")12541255 # Для fromutc требуется собственная реализация, так как1256 # входные данные для этой функции – это datetime со значениями UTC1257 # но с tzinfo, установленным на self.1258 # См. datetime.astimezone или fromtimestamp.1259 if when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:1260 return when + dt.timedelta(hours=4, minutes=30)1261 else:1262 return when + dt.timedelta(hours=4)12631264 def dst(self, when):1265 # В Кабуле не соблюдается летнее время.1266 return dt.timedelta(0)12671268 def tzname(self, when):1269 if when >= self.UTC_MOVE_DATE:1270 return "+04:30"1271 return "+04"1272```12731274Использование `KabulTz` из примера выше:12751276```python1277>>> tz1 = KabulTz()12781279>>> # Datetime до изменения1280>>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)1281>>> print(dt1.utcoffset())12824:00:0012831284>>> # Datetime после изменения1285>>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)1286>>> print(dt2.utcoffset())12874:30:0012881289>>> # Преобразовать datetime в другой часовой пояс1290>>> dt3 = dt2.astimezone(dt.timezone.utc)1291>>> dt31292datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)1293>>> dt21294datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())1295>>> dt2 == dt31296True1297```12981299## `time` объекты13001301Объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) представляет (локальное) время суток, не привязанное к определённому дню и может корректироваться с помощью объекта [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo).13021303#### `class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)`13041305Все аргументы необязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo). Остальные аргументы должны быть целыми числами в следующих диапазонах:13061307- `0 <= hour < 24`,1308- `0 <= minute < 60`,1309- `0 <= second < 60`,1310- `0 <= microsecond < 1000000`,1311- `fold in [0, 1]`.13121313Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Все по умолчанию равны 0, кроме *tzinfo*, который по умолчанию равен `None`.13141315Атрибуты класса:13161317#### `time.min`13181319Самое раннее представимое [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time), `time(0, 0, 0, 0)`.13201321#### `time.max`13221323Самое позднее представимое [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time), `time(23, 59, 59, 999999)`.13241325#### `time.resolution`13261327Наименьшая возможная разница между неравными объектами [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time), `timedelta(microseconds=1)`, хотя следует отметить, что арифметические операции над объектами `time` не поддерживаются.13281329Атрибуты экземпляра (только для чтения):13301331#### `time.hour`13321333В `range(24)`.13341335#### `time.minute`13361337В `range(60)`.13381339#### `time.second`13401341В `range(60)`.13421343#### `time.microsecond`13441345В `range(1000000)`.13461347#### `time.tzinfo`13481349Объект, переданный как аргумент tzinfo конструктору [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time), или `None`, если ничего не было передано.13501351#### `time.fold`13521353В `[0, 1]`. Используется для устранения неоднозначности поясного времени в повторяющемся интервале. (Повторяющийся интервал возникает, когда часы переводятся назад в конце перехода на летнее время или когда смещение UTC для текущего часового пояса уменьшается по политическим причинам.) Значения 0 и 1 представляют соответственно более ранний и более поздний из двух моментов с одинаковым представлением поясного времени.13541355Добавлено в версии 3.6.13561357Объекты [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) поддерживают сравнение на равенство и порядок, где `a` считается меньше `b`, если `a` предшествует `b` во времени.13581359Наивные и осведомлённые объекты `time` никогда не равны. Сравнение по порядку между наивными и осведомлёнными объектами `time` вызывает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError).13601361Если оба сравниваемых объекта осведомлённые и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.time.tzinfo), атрибуты `tzinfo` и `fold` игнорируются, и сравниваются базовые времена. Если оба сравниваемых объекта осведомлённые и имеют разные атрибуты `tzinfo`, сравниваемые объекты сначала корректируются путём вычитания их смещений UTC (полученных из `self.utcoffset()`).13621363Изменено в версии 3.3: Сравнения на равенство между осведомлёнными и наивными экземплярами [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) не вызывают [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError).13641365В булевом контексте объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) всегда считается истинным.13661367Изменено в версии 3.5: До Python 3.5 объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) считался ложным, если он представлял полночь по UTC. Это поведение считалось неочевидным и чреватым ошибками и было удалено в Python 3.5. См. [bpo-13936](https://python-all.ru/3.16/library/datetime.html) для получения дополнительной информации.13681369Другие конструкторы:13701371#### `classmethod time.fromisoformat(time_string)`13721373Возвращает объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time), соответствующий строке *time\_string* в любом допустимом формате ISO 8601, со следующими исключениями:137413751. Смещения часовых поясов могут содержать доли секунды.13762. Ведущий символ `T`, обычно обязательный в случаях, когда возможна неоднозначность между датой и временем, не требуется.13773. Доли секунды могут содержать любое количество цифр (всё, что больше 6, будет усечено).13784. Доли часов и минут не поддерживаются.13791380Примеры:13811382```pycon1383>>> import datetime as dt1384>>> dt.time.fromisoformat('04:23:01')1385datetime.time(4, 23, 1)1386>>> dt.time.fromisoformat('T04:23:01')1387datetime.time(4, 23, 1)1388>>> dt.time.fromisoformat('T042301')1389datetime.time(4, 23, 1)1390>>> dt.time.fromisoformat('04:23:01.000384')1391datetime.time(4, 23, 1, 384)1392>>> dt.time.fromisoformat('04:23:01,000384')1393datetime.time(4, 23, 1, 384)1394>>> dt.time.fromisoformat('04:23:01+04:00')1395datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))1396>>> dt.time.fromisoformat('04:23:01Z')1397datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)1398>>> dt.time.fromisoformat('04:23:01+00:00')1399datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)1400```14011402Добавлено в версии 3.7.14031404Изменено в версии 3.11: Ранее этот метод поддерживал только форматы, которые могли быть возвращены [`time.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.isoformat).14051406#### `classmethod time.strptime(date_string, format)`14071408Возвращает объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time), соответствующий *date\_string*, разобранный в соответствии с *format*.14091410Если *format* не содержит микросекунд или информации о часовом поясе, это эквивалентно:14111412```python1413time(*(time.strptime(date_string, format)[3:6]))1414```14151416Исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) возникает, если *date\_string* и *format* не могут быть разобраны с помощью `time.strptime()` или если возвращается значение, не являющееся временным кортежем. См. также [поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`time.fromisoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.fromisoformat).14171418Добавлено в версии 3.14.14191420Методы экземпляра:14211422#### `time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)`14231424Возвращает новый объект [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) с теми же значениями, но с обновлёнными указанными параметрами. Обратите внимание, что `tzinfo=None` может быть указан для создания наивного `time` из осведомлённого `time` без преобразования данных времени.14251426Объекты [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) также поддерживаются обобщённой функцией [`copy.replace()`](https://python-all.ru/3.16/library/copy.html#copy.replace).14271428Изменено в версии 3.6: Добавлен параметр *fold*.14291430#### `time.isoformat(timespec='auto')`14311432Возвращает строку, представляющую время в формате ISO 8601, одну из:14331434- `HH:MM:SS.ffffff`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.time.microsecond) не равно 01435- `HH:MM:SS`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.time.microsecond) равно 01436- `HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]`, если [`utcoffset()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.utcoffset) не возвращает `None`1437- `HH:MM:SS+HH:MM[:SS[.ffffff]]`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.time.microsecond) равно 0 и [`utcoffset()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.utcoffset) не возвращает `None`14381439Необязательный аргумент *timespec* указывает количество дополнительных компонентов времени, которые нужно включить (по умолчанию `'auto'`). Он может быть одним из следующих:14401441- `'auto'`: То же, что и `'seconds'`, если [`microsecond`](https://python-all.ru/3.16/library/datetime.html#datetime.time.microsecond) равно 0, иначе то же, что и `'microseconds'`.1442- `'hours'`: Включает [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.time.hour) в двухзначном формате `HH`.1443- `'minutes'`: Включает [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.time.hour) и [`minute`](https://python-all.ru/3.16/library/datetime.html#datetime.time.minute) в формате `HH:MM`.1444- `'seconds'`: Включает [`hour`](https://python-all.ru/3.16/library/datetime.html#datetime.time.hour), [`minute`](https://python-all.ru/3.16/library/datetime.html#datetime.time.minute) и [`second`](https://python-all.ru/3.16/library/datetime.html#datetime.time.second) в формате `HH:MM:SS`.1445- `'milliseconds'`: Включает полное время, но усекает дробную часть секунд до миллисекунд. Формат `HH:MM:SS.sss`.1446- `'microseconds'`: Включает полное время в формате `HH:MM:SS.ffffff`.14471448> **Примечание**1449>1450> Исключённые компоненты времени усекаются, а не округляются.14511452[`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) будет вызвано при недопустимом аргументе *timespec*.14531454Пример:14551456```python1457>>> import datetime as dt1458>>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')1459'12:34'1460>>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0)1461>>> my_time.isoformat(timespec='microseconds')1462'12:34:56.000000'1463>>> my_time.isoformat(timespec='auto')1464'12:34:56'1465```14661467Изменено в версии 3.6: Добавлен параметр *timespec*.14681469#### `time.__str__()`14701471Для времени `t` `str(t)` эквивалентно `t.isoformat()`.14721473#### `time.strftime(format)`14741475Возвращает строку, представляющую время, управляемую явной строкой формата. См. также [поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`time.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.isoformat).14761477#### `time.__format__(format)`14781479То же, что и [`time.strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.strftime). Это позволяет указать строку формата для объекта [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) в [строковых литералах с форматированием](https://python-all.ru/3.16/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format). См. также [поведение strftime() и strptime()](https://python-all.ru/3.16/library/datetime.html#strftime-strptime-behavior) и [`time.isoformat()`](https://python-all.ru/3.16/library/datetime.html#datetime.time.isoformat).14801481#### `time.utcoffset()`14821483Если [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(None)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) с величиной менее одного дня.14841485Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.14861487#### `time.dst()`14881489Если [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.dst(None)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) с величиной менее одного дня.14901491Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.14921493#### `time.tzname()`14941495Если [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.tzname(None)`, или возбуждает исключение, если последнее не возвращает `None` или строковый объект.14961497### Примеры использования: `time`14981499Примеры работы с объектом [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time):15001501```python1502>>> import datetime as dt1503>>> class TZ1(dt.tzinfo):1504... def utcoffset(self, when):1505... return dt.timedelta(hours=1)1506... def dst(self, when):1507... return dt.timedelta(0)1508... def tzname(self, when):1509... return "+01:00"1510... def __repr__(self):1511... return f"{self.__class__.__name__}()"1512...1513>>> t = dt.time(12, 10, 30, tzinfo=TZ1())1514>>> t1515datetime.time(12, 10, 30, tzinfo=TZ1())1516>>> t.isoformat()1517'12:10:30+01:00'1518>>> t.dst()1519datetime.timedelta(0)1520>>> t.tzname()1521'+01:00'1522>>> t.strftime("%H:%M:%S %Z")1523'12:10:30 +01:00'1524>>> 'The {} is {:%H:%M}.'.format("time", t)1525'The time is 12:10.'1526```15271528## `tzinfo` объекты15291530#### `class datetime.tzinfo`15311532Это [абстрактный базовый класс](https://python-all.ru/3.16/glossary.html#term-abstract-base-class), то есть этот класс не следует инстанциировать напрямую. Определите подкласс `tzinfo` для хранения информации о конкретном часовом поясе.15331534Экземпляр (конкретного подкласса) `tzinfo` можно передать конструкторам объектов [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time). Последние рассматривают свои атрибуты как местное время, а объект `tzinfo` поддерживает методы, показывающие смещение местного времени от UTC, название часового пояса и смещение DST – все относительно переданного им объекта даты или времени.15351536Необходимо создать конкретный подкласс и (как минимум) реализовать стандартные методы `tzinfo`, необходимые для используемых методов [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime). Модуль `datetime` предоставляет [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone) – простой конкретный подкласс `tzinfo`, который может представлять часовые пояса с фиксированным смещением от UTC, такие как сам UTC или североамериканские EST и EDT.15371538Особое требование для сериализации с помощью pickle: подкласс `tzinfo` должен иметь метод [`__init__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__init__), который можно вызвать без аргументов, иначе объект можно сериализовать, но возможно не удастся десериализовать обратно. Это техническое требование, которое может быть ослаблено в будущем.15391540Конкретному подклассу `tzinfo` может потребоваться реализовать следующие методы. Какие именно методы нужны, зависит от того, как используются осведомлённые (aware) объекты `datetime`. Если есть сомнения, просто реализуйте их все.15411542#### `tzinfo.utcoffset(dt)`15431544Возвращает смещение местного времени от UTC в виде объекта [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta), которое положительно к востоку от UTC. Если местное время к западу от UTC, оно должно быть отрицательным.15451546Это представляет *общее* смещение от UTC; например, если объект [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) представляет как часовой пояс, так и корректировки DST, `utcoffset()` должен возвращать их сумму. Если смещение UTC неизвестно, верните `None`. В противном случае возвращаемое значение должно быть объектом [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) строго между `-timedelta(hours=24)` и `timedelta(hours=24)` (величина смещения должна быть меньше одного дня). Большинство реализаций `utcoffset()` будут выглядеть как один из этих двух вариантов:15471548```python1549return CONSTANT # класс с фиксированным смещением1550return CONSTANT + self.dst(dt) # класс, учитывающий летнее время1551```15521553Если `utcoffset()` не возвращает `None`, то [`dst()`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo.dst) также не должен возвращать `None`.15541555Реализация по умолчанию `utcoffset()` возбуждает [`NotImplementedError`](https://python-all.ru/3.16/library/exceptions.html#NotImplementedError).15561557Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.15581559#### `tzinfo.dst(dt)`15601561Возвращает поправку на летнее время (DST) в виде объекта [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) или `None`, если информация о DST неизвестна.15621563Возвращает `timedelta(0)`, если DST не действует. Если DST действует, возвращает смещение в виде объекта [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta) (подробнее см. [`utcoffset()`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo.utcoffset)). Обратите внимание, что смещение DST, если применимо, уже добавлено к смещению UTC, возвращаемому `utcoffset()`, поэтому нет необходимости обращаться к `dst()`, если только вы не хотите получить информацию о DST отдельно. Например, [`datetime.timetuple()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.timetuple) вызывает метод `dst()` своего атрибута [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzinfo), чтобы определить, как должен быть установлен флаг [`tm_isdst`](https://python-all.ru/3.16/library/time.html#time.struct_time.tm_isdst), а [`tzinfo.fromutc()`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo.fromutc) вызывает `dst()` для учёта изменений DST при пересечении часовых поясов.15641565Экземпляр *tz* подкласса [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), который моделирует как стандартное, так и летнее время, должен быть согласован в следующем смысле:15661567`tz.utcoffset(dt) - tz.dst(dt)`15681569должен возвращать один и тот же результат для каждого [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) *dt* с `dt.tzinfo == tz`. Для разумных подклассов `tzinfo` это выражение даёт «стандартное смещение» часового пояса, которое не должно зависеть от даты или времени, а только от географического положения. Реализация [`datetime.astimezone()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.astimezone) полагается на это, но не может обнаружить нарушения; ответственность за это лежит на программисте. Если подкласс `tzinfo` не может этого гарантировать, он может переопределить реализацию по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo.fromutc), чтобы она корректно работала с `astimezone()` в любом случае.15701571Большинство реализаций `dst()`, вероятно, будут выглядеть как один из этих двух вариантов:15721573```python1574import datetime as dt15751576def dst(self, when):1577 # класс с фиксированным смещением: не учитывает летнее время1578 return dt.timedelta(0)1579```15801581или:15821583```python1584import datetime as dt15851586def dst(self, when):1587 # Код для установки dston и dstoff в значения летнего времени часового пояса1588 # время перехода на основе входного when.year, выраженное1589 # в стандартном местном времени.15901591 if dston <= when.replace(tzinfo=None) < dstoff:1592 return dt.timedelta(hours=1)1593 else:1594 return dt.timedelta(0)1595```15961597Реализация по умолчанию `dst()` вызывает исключение [`NotImplementedError`](https://python-all.ru/3.16/library/exceptions.html#NotImplementedError).15981599Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.16001601#### `tzinfo.tzname(dt)`16021603Возвращает название часового пояса, соответствующее объекту [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) *dt*, в виде строки. Модуль `datetime` не определяет никаких правил для строковых названий, и нет требований, чтобы они что-то конкретное означали. Например, `"GMT"`, `"UTC"`, `"-500"`, `"-5:00"`, `"EDT"`, `"US/Eastern"`, `"America/New York"` – все это допустимые ответы. Возвращает `None`, если строковое название неизвестно. Обратите внимание, что это метод, а не фиксированная строка, главным образом потому, что некоторые подклассы [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) могут возвращать разные названия в зависимости от конкретного значения переданного *dt*, особенно если класс `tzinfo` учитывает летнее время.16041605Реализация по умолчанию `tzname()` вызывает исключение [`NotImplementedError`](https://python-all.ru/3.16/library/exceptions.html#NotImplementedError).16061607Эти методы вызываются объектом [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) или [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) в ответ на их одноимённые методы. Объект `datetime` передаёт себя в качестве аргумента, а объект `time` передаёт `None`. Поэтому методы подкласса [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) должны быть готовы принять аргумент *dt* типа `None` или класса `datetime`.16081609Когда передаётся `None`, разработчик класса должен решить, какой ответ будет наилучшим. Например, возврат `None` уместен, если класс хочет показать, что объекты времени не участвуют в протоколах [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo). Возможно, более полезным будет, чтобы `utcoffset(None)` возвращал стандартное смещение UTC, так как нет другого соглашения для его определения.16101611Когда объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) передаётся в ответ на метод `datetime`, `dt.tzinfo` является тем же объектом, что и *self*. Методы [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) могут на это полагаться, если только пользовательский код не вызывает методы `tzinfo` напрямую. Смысл в том, что методы `tzinfo` интерпретируют *dt* как местное время и не должны беспокоиться об объектах в других часовых поясах.16121613Существует ещё один метод [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), который подкласс может переопределить:16141615#### `tzinfo.fromutc(dt)`16161617Этот метод вызывается из реализации по умолчанию [`datetime.astimezone()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.astimezone). При таком вызове `dt.tzinfo` является *self*, а данные даты и времени *dt* рассматриваются как время UTC. Цель `fromutc()` – скорректировать данные даты и времени, вернув эквивалентный datetime в местном времени *self*.16181619Большинство подклассов [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo) должны без проблем наследовать реализацию по умолчанию `fromutc()`. Она достаточно сильна, чтобы обрабатывать часовые пояса с фиксированным смещением, а также пояса, учитывающие стандартное и летнее время, причём последние – даже если время перехода на летнее время различается в разные годы. Пример часового пояса, который реализация по умолчанию `fromutc()` может обрабатывать неправильно в некоторых случаях, – это пояс, где стандартное смещение (от UTC) зависит от конкретной переданной даты и времени, что может происходить по политическим причинам. Реализации по умолчанию [`astimezone()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.astimezone) и `fromutc()` могут не дать желаемого результата, если результат приходится на часы, пересекающие момент изменения стандартного смещения.16201621Опуская код для обработки ошибок, реализация по умолчанию `fromutc()` работает следующим образом:16221623```python1624import datetime as dt16251626def fromutc(self, when):1627 # вызывает ValueError, если when.tzinfo не является self1628 dtoff = when.utcoffset()1629 dtdst = when.dst()1630 # вызывает ValueError, если dtoff или dtdst равны None1631 delta = dtoff - dtdst # это стандартное смещение self1632 if delta:1633 when += delta # преобразовать в стандартное местное время1634 dtdst = when.dst()1635 # вызывает ValueError, если dtdst равен None1636 if dtdst:1637 return when + dtdst1638 else:1639 return when1640```16411642В следующем файле [`tzinfo_examples.py`](https://python-all.ru/3.16/_downloads/6dc1f3f4f0e6ca13cb42ddf4d6cbc8af/tzinfo_examples.py) приведены некоторые примеры классов [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo):16431644```python1645import datetime as dt16461647# Класс, отражающий представление платформы о местном времени.1648# (Может приводить к неверным значениям для исторических моментов в1649# часовых поясах, где UTC-смещение и/или правила летнего времени1650# менялись в прошлом.)1651import time16521653ZERO = dt.timedelta(0)1654HOUR = dt.timedelta(hours=1)1655SECOND = dt.timedelta(seconds=1)16561657STDOFFSET = dt.timedelta(seconds=-time.timezone)1658if time.daylight:1659 DSTOFFSET = dt.timedelta(seconds=-time.altzone)1660else:1661 DSTOFFSET = STDOFFSET16621663DSTDIFF = DSTOFFSET - STDOFFSET16641665class LocalTimezone(dt.tzinfo):16661667 def fromutc(self, when):1668 assert when.tzinfo is self1669 stamp = (when - dt.datetime(1970, 1, 1, tzinfo=self)) // SECOND1670 args = time.localtime(stamp)[:6]1671 dst_diff = DSTDIFF // SECOND1672 # Обнаружение fold1673 fold = (args == time.localtime(stamp - dst_diff))1674 return dt.datetime(*args, microsecond=when.microsecond,1675 tzinfo=self, fold=fold)16761677 def utcoffset(self, when):1678 if self._isdst(when):1679 return DSTOFFSET1680 else:1681 return STDOFFSET16821683 def dst(self, when):1684 if self._isdst(when):1685 return DSTDIFF1686 else:1687 return ZERO16881689 def tzname(self, when):1690 return time.tzname[self._isdst(when)]16911692 def _isdst(self, when):1693 tt = (when.year, when.month, when.day,1694 when.hour, when.minute, when.second,1695 when.weekday(), 0, 0)1696 stamp = time.mktime(tt)1697 tt = time.localtime(stamp)1698 return tt.tm_isdst > 016991700Local = LocalTimezone()17011702# Полная реализация текущих правил летнего времени для основных часовых поясов США.17031704def first_sunday_on_or_after(when):1705 days_to_go = 6 - when.weekday()1706 if days_to_go:1707 when += dt.timedelta(days_to_go)1708 return when17091710# Правила летнего времени в США1711#1712# Это упрощённый набор правил для США (т.е. неверный для некоторых случаев)1713# времени начала и окончания летнего времени. Полный и актуальный набор правил летнего времени1714# и определений часовых поясов смотрите в базе данных Olson (или попробуйте pytz):1715# http://www.twinsun.com/tz/tz-link.htm1716# https://sourceforge.net/projects/pytz/ (возможно, не актуально)1717#1718# В США с 2007 года летнее время начинается в 2 часа ночи (стандартное время) во второе1719# воскресенье марта, то есть первое воскресенье 8 марта или после него.1720DSTSTART_2007 = dt.datetime(1, 3, 8, 2)1721# и заканчивается в 2 часа ночи (летнее время) в первое воскресенье ноября.1722DSTEND_2007 = dt.datetime(1, 11, 1, 2)1723# С 1987 по 2006 год летнее время начиналось в 2 часа ночи (стандартное время) в первое1724# воскресенье апреля и заканчивалось в 2 часа ночи (летнее время) в последнее1725# воскресенье октября, то есть первое воскресенье 25 октября или после него.1726DSTSTART_1987_2006 = dt.datetime(1, 4, 1, 2)1727DSTEND_1987_2006 = dt.datetime(1, 10, 25, 2)1728# С 1967 по 1986 год летнее время начиналось в 2 часа ночи (стандартное время) в последнее1729# воскресенье апреля (то есть 24 апреля или после него) и заканчивалось в 2 часа ночи (летнее время)1730# в последнее воскресенье октября, которое является первым воскресеньем1731# 25 октября или позднее.1732DSTSTART_1967_1986 = dt.datetime(1, 4, 24, 2)1733DSTEND_1967_1986 = DSTEND_1987_200617341735def us_dst_range(year):1736 # Найти время начала и окончания перехода на летнее время в США. Для лет до 1967 года вернуть1737 # start = end, если летнее время не применяется.1738 if 2006 < year:1739 dststart, dstend = DSTSTART_2007, DSTEND_20071740 elif 1986 < year < 2007:1741 dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_20061742 elif 1966 < year < 1987:1743 dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_19861744 else:1745 return (dt.datetime(year, 1, 1), ) * 217461747 start = first_sunday_on_or_after(dststart.replace(year=year))1748 end = first_sunday_on_or_after(dstend.replace(year=year))1749 return start, end17501751class USTimeZone(dt.tzinfo):17521753 def __init__(self, hours, reprname, stdname, dstname):1754 self.stdoffset = dt.timedelta(hours=hours)1755 self.reprname = reprname1756 self.stdname = stdname1757 self.dstname = dstname17581759 def __repr__(self):1760 return self.reprname17611762 def tzname(self, when):1763 if self.dst(when):1764 return self.dstname1765 else:1766 return self.stdname17671768 def utcoffset(self, when):1769 return self.stdoffset + self.dst(when)17701771 def dst(self, when):1772 if when is None or when.tzinfo is None:1773 # В одном или обоих случаях здесь может быть уместно исключение.1774 # Это зависит от того, как вы хотите их обрабатывать. Реализация по умолчанию1775 # fromutc() (вызываемая реализацией astimezone() по умолчанию)1776 # передаёт объект datetime, у которого when.tzinfo равен self.1777 return ZERO1778 assert when.tzinfo is self1779 start, end = us_dst_range(when.year)1780 # Нельзя сравнивать наивные и осведомлённые объекты, поэтому сначала удалите часовой пояс из1781 # when.1782 when = when.replace(tzinfo=None)1783 if start + HOUR <= when < end - HOUR:1784 # Действует летнее время.1785 return HOUR1786 if end - HOUR <= when < end:1787 # Fold (неоднозначный час): используйте when.fold для разрешения неоднозначности.1788 return ZERO if when.fold else HOUR1789 if start <= when < start + HOUR:1790 # Gap (несуществующий час): примените обратное правило fold.1791 return HOUR if when.fold else ZERO1792 # Летнее время не действует.1793 return ZERO17941795 def fromutc(self, when):1796 assert when.tzinfo is self1797 start, end = us_dst_range(when.year)1798 start = start.replace(tzinfo=self)1799 end = end.replace(tzinfo=self)1800 std_time = when + self.stdoffset1801 dst_time = std_time + HOUR1802 if end <= dst_time < end + HOUR:1803 # Повторяющийся час1804 return std_time.replace(fold=1)1805 if std_time < start or dst_time >= end:1806 # Стандартное время1807 return std_time1808 if start <= std_time < end - HOUR:1809 # Летнее время1810 return dst_time18111812Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")1813Central = USTimeZone(-6, "Central", "CST", "CDT")1814Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")1815Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")1816```18171818Обратите внимание, что в подклассе [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), учитывающем как стандартное, так и летнее время, дважды в год в точках перехода на летнее время возникают неизбежные тонкости. Для конкретики рассмотрим восточное время США (UTC -0500), где EDT начинается через минуту после 1:59 (EST) во второе воскресенье марта и заканчивается через минуту после 1:59 (EDT) в первое воскресенье ноября:18191820```python1821 UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM1822 EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM1823 EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM18241825start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM18261827 end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM1828```18291830Когда начинается летнее время (строка «start»), местные настенные часы перескакивают с 1:59 на 3:00. Местное время вида 2:MM в этот день не имеет смысла, поэтому `astimezone(Eastern)` не вернёт результат с `hour == 2` в день начала DST. Например, при переходе на летнее время весной 2016 года мы получаем:18311832```python1833>>> import datetime as dt1834>>> from tzinfo_examples import HOUR, Eastern1835>>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.timezone.utc)1836>>> for i in range(4):1837... u = u0 + i*HOUR1838... t = u.astimezone(Eastern)1839... print(u.time(), 'UTC =', t.time(), t.tzname())1840...184105:00:00 UTC = 00:00:00 EST184206:00:00 UTC = 01:00:00 EST184307:00:00 UTC = 03:00:00 EDT184408:00:00 UTC = 04:00:00 EDT1845```18461847Когда заканчивается летнее время (строка «end»), возникает потенциально более серьёзная проблема: есть час, который невозможно однозначно выразить в местном настенном времени – последний час летнего времени. В восточном поясе это время вида 5:MM UTC в день окончания летнего времени. Местные настенные часы перескакивают с 1:59 (летнее время) обратно на 1:00 (стандартное время). Местные времена вида 1:MM становятся неоднозначными. [`astimezone()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.astimezone) имитирует поведение местных часов, отображая два соседних часа UTC в один и тот же местный час. В примере с восточным поясом времена UTC вида 5:MM и 6:MM оба отображаются в 1:MM при преобразовании в восточное время, но у более ранних времен атрибут [`fold`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fold) установлен в 0, а у более поздних – в 1. Например, при переходе на зимнее время осенью 2016 года мы получаем:18481849```python1850>>> import datetime as dt1851>>> from tzinfo_examples import HOUR, Eastern1852>>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.timezone.utc)1853>>> for i in range(4):1854... u = u0 + i*HOUR1855... t = u.astimezone(Eastern)1856... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)1857...185804:00:00 UTC = 00:00:00 EDT 0185905:00:00 UTC = 01:00:00 EDT 0186006:00:00 UTC = 01:00:00 EST 1186107:00:00 UTC = 02:00:00 EST 01862```18631864Обратите внимание, что экземпляры [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), отличающиеся только значением атрибута [`fold`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fold), считаются равными при сравнении.18651866Приложения, которые не могут мириться с неоднозначностью местного времени, должны явно проверять значение атрибута [`fold`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.fold) или избегать использования гибридных подклассов [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo); неоднозначности отсутствуют при использовании [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone) или любого другого подкласса `tzinfo` с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).18671868> **См. также**1869>1870> > **[`zoneinfo`](https://python-all.ru/3.16/library/zoneinfo.html#module-zoneinfo)**1871> >1872> > Модуль `datetime` содержит базовый класс [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone) (для обработки произвольных фиксированных смещений от UTC) и его атрибут [`timezone.utc`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone.utc) (экземпляр UTC `timezone`).1873> >1874> > `zoneinfo` предоставляет Python базу данных *IANA time zone database* (также известную как база данных Olson), и её использование рекомендуется.1875>1876> **[база данных часовых поясов IANA](https://python-all.ru/3.16/library/datetime.html)**1877>1878> База данных часовых поясов (часто называемая tz, tzdata или zoneinfo) содержит код и данные, представляющие историю местного времени для множества характерных мест по всему миру. Она периодически обновляется, чтобы отражать изменения, вносимые политическими органами в границы часовых поясов, смещения UTC и правила перехода на летнее время.18791880## `timezone` объекты18811882Класс [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone) является подклассом [`tzinfo`](https://python-all.ru/3.16/library/datetime.html#datetime.tzinfo), каждый экземпляр которого представляет часовой пояс, определяемый фиксированным смещением от UTC.18831884Объекты этого класса нельзя использовать для представления информации о часовом поясе в местах, где в разные дни года используются разные смещения или где в гражданское время вносились исторические изменения.18851886#### `class datetime.timezone(offset[, name])`18871888Аргумент *offset* должен быть задан как объект [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta), представляющий разницу между местным временем и UTC. Он должен находиться строго между `-timedelta(hours=24)` и `timedelta(hours=24)`, в противном случае возникает исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).18891890Аргумент *name* необязателен. Если он указан, это должна быть строка, которая будет использоваться в качестве значения, возвращаемого методом [`datetime.tzname()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzname).18911892Добавлено в версии 3.2.18931894Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.18951896#### `timezone.utcoffset(dt)`18971898Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone).18991900Аргумент *dt* игнорируется. Возвращаемое значение – экземпляр [`timedelta`](https://python-all.ru/3.16/library/datetime.html#datetime.timedelta), равный разнице между местным временем и UTC.19011902Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.19031904#### `timezone.tzname(dt)`19051906Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone).19071908Если *name* не указан в конструкторе, имя, возвращаемое `tzname(dt)`, генерируется из значения `offset` следующим образом. Если *offset* равно `timedelta(0)`, то имя – «UTC», иначе это строка в формате `UTC±HH:MM`, где ± – это знак `offset`, HH и MM – две цифры `offset.hours` и `offset.minutes` соответственно.19091910Изменено в версии 3.6: Имя, генерируемое из `offset=timedelta(0)`, теперь является обычным `'UTC'`, а не `'UTC+00:00'`.19111912#### `timezone.dst(dt)`19131914Всегда возвращает `None`.19151916#### `timezone.fromutc(dt)`19171918Возвращает `dt + offset`. Аргумент *dt* должен быть осведомлённым экземпляром [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime), с `tzinfo`, установленным в `self`.19191920Атрибуты класса:19211922#### `timezone.utc`19231924Часовой пояс UTC, `timezone(timedelta(0))`.19251926## Поведение `strftime()` и `strptime()`19271928Объекты [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) поддерживают метод `strftime(format)`, который создаёт строку, представляющую время с использованием явной строки формата.19291930И наоборот, методы классов [`date.strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.strptime), [`datetime.strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) и [`time.strptime()`](https://python-all.ru/3.16/library/time.html#time.strptime) создают объект из строки, представляющей время, и соответствующей строки формата.19311932Приведённая ниже таблица даёт высокоуровневое сравнение [`strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strftime) и [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime):19331934| | `strftime` | `strptime` |1935| --- | --- | --- |1936| Использование | Преобразовать объект в строку по заданному формату | Разобрать строку в объект по соответствующему формату |1937| Тип метода | Метод экземпляра | Метод класса |1938| Сигнатура | `strftime(format)` | `strptime(date_string, format)` |19391940>19411942### Коды формата `strftime()` и `strptime()`19431944Эти методы принимают коды формата, которые можно использовать для разбора и форматирования дат:19451946```python1947>>> import datetime as dt1948>>> dt.datetime.strptime('31/01/22 23:59:59.999999',1949... '%d/%m/%y %H:%M:%S.%f')1950datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)1951>>> _.strftime('%a %d %b %Y, %I:%M%p')1952'Mon 31 Jan 2022, 11:59PM'1953```19541955Ниже приведён список всех кодов форматирования, которые требуются стандартом C 2011 года. Они работают на всех поддерживаемых платформах.19561957| Директива | Значение | Пример | Примечания |1958| --- | --- | --- | --- |1959| `%a` | День недели как сокращённое название в локали. | Sun, Mon, …, Sat (en\_US); So, Mo, …, Sa (de\_DE) | (1) |1960| `%A` | Название дня недели в полной форме, зависящее от локали. | Sunday, Monday, …, Saturday (en\_US); Sonntag, Montag, …, Samstag (de\_DE) | (1) |1961| `%b` | Название месяца в сокращённой форме, зависящей от локали. | Jan, Feb, …, Dec (en\_US); Jan, Feb, …, Dez (de\_DE) | (1) |1962| `%B` | Название месяца в полной форме, зависящей от локали. | January, February, …, December (en\_US); Januar, Februar, …, Dezember (de\_DE) | (1) |1963| `%c` | Представление даты и времени, подходящее для локали. | Tue Aug 16 21:30:00 1988 (en\_US); Di 16 Aug 21:30:00 1988 (de\_DE) | (1) |1964| `%C` | Год, делённый на 100 и усечённый до целого, в виде десятичного числа, дополненного нулями слева. | 01, 02, …, 99 | (0) |1965| `%d` | День месяца в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 31 | (9), (10) |1966| `%D` | Эквивалентно `%m/%d/%y`. | 11/28/25 | (9) |1967| `%e` | День месяца в виде десятичного числа, дополненного пробелами слева. | ␣1, ␣2, …, 31 | (10) |1968| `%F` | Эквивалентно `%Y-%m-%d`, формату ISO 8601. | 2025-10-11, 1001-12-30 | |1969| `%g` | Последние две цифры года ISO 8601, обозначающие год, в который входит большая часть ISO-недели (`%V`). | 00, 01, …, 99 | (0) |1970| `%G` | Год по ISO 8601 с веком, представляющий год, который содержит большую часть недели по ISO 8601 (`%V`). | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |1971| `%h` | Эквивалентно `%b`. | См. `%b`. | (0) |1972| `%H` | Часы (в 24-часовом формате) в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 23 | (9) |1973| `%I` | Часы (в 12-часовом формате) в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 | (9) |1974| `%j` | День года в виде десятичного числа, дополненного слева нулями. | 001, 002, …, 366 | (9) |1975| `%m` | Месяц в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 | (9) |1976| `%M` | Минуты в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 | (9) |1977| `%n` | Символ новой строки (`'\n'`). Для `strptime()` – ноль или более пробельных символов. | `\n` | |1978| `%p` | Эквивалент AM или PM, зависящий от локали. | AM, PM (en\_US); am, pm (de\_DE) | (1), (3) |1979| `%r` | Время в 12-часовом формате, принятое в локали. | 12:00:00 AM | (1), (0) |1980| `%R` | Эквивалентно `%H:%M`. | 10:01 | |1981| `%S` | Секунды в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 | (4), (9) |1982| `%t` | Символ табуляции (`'\t'`). Для `strptime()` – ноль или более пробельных символов. | `\t` | |1983| `%T` | Формат времени ISO 8601, эквивалентный `%H:%M:%S`. | 10:01:59 | |1984| `%u` | День недели по ISO 8601 в виде десятичного числа, где 1 – понедельник. | 1, 2, …, 7 | |1985| `%U` | Номер недели в году (воскресенье – первый день недели) в виде десятичного числа, дополненного слева нулями. Все дни в новом году до первого воскресенья считаются неделей 0. | 00, 01, …, 53 | (7), (9) |1986| `%V` | Неделя по ISO 8601 в виде десятичного числа, где понедельник считается первым днём недели. Неделя 01 – это неделя, содержащая 4 января. | 01, 02, …, 53 | (8), (9) |1987| `%w` | День недели в виде десятичного числа, где 0 – воскресенье, а 6 – суббота. | 0, 1, …, 6 | |1988| `%W` | Номер недели в году (понедельник – первый день недели) в виде десятичного числа, дополненного слева нулями. Все дни в новом году до первого понедельника считаются неделей 0. | 00, 01, …, 53 | (7), (9) |1989| `%x` | Представление даты, соответствующее локали. | 08/16/88 (None); 08/16/1988 (en\_US); 16.08.1988 (de\_DE) | (1) |1990| `%X` | Представление времени, соответствующее локали. | 21:30:00 (en\_US); 21:30:00 (de\_DE) | (1) |1991| `%y` | Год без столетия в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 99 | (9) |1992| `%Y` | Год со столетием в виде десятичного числа. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |1993| `%z` | Смещение UTC в формате `±HHMM[SS[.ffffff]]` (пустая строка, если объект наивный). | (пусто), +0000, -0400, +1030, +063415, -030712.345216 | (6) |1994| `%Z` | Название часового пояса (пустая строка, если объект наивный). | (пусто), UTC, GMT | (6) |1995| `%%` | Литеральный символ `'%'`. | % | |19961997Директивы года ISO 8601 и недели ISO 8601 не взаимозаменяемы с указанными выше директивами года и номера недели. Вызов [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) с неполными или неоднозначными директивами ISO 8601 приведёт к возникновению [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).19981999Для удобства включено несколько дополнительных директив, не требуемых стандартом C11.20002001| Директива | Значение | Пример | Примечания |2002| --- | --- | --- | --- |2003| `%f` | Микросекунды в виде десятичного числа, дополненного слева нулями до 6 цифр. | 000000, 000001, …, 999999 | (5) |2004| `%:z` | Смещение UTC в формате `±HH:MM[:SS[.ffffff]]` (пустая строка, если объект наивный). | (пусто), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216 | (6) |20052006Полный набор поддерживаемых кодов формата зависит от платформы, поскольку Python вызывает функцию `strftime()` из библиотеки C платформы, а различия между платформами распространены. Чтобы увидеть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации *[strftime(3)](https://python-all.ru/3.16/library/datetime.html)*. Также существуют различия между платформами в обработке неподдерживаемых спецификаторов формата.20072008Добавлено в версии 3.6: `%G`, `%u` и `%V` были добавлены.20092010Добавлено в версии 3.12: `%:z` был добавлен для [`strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strftime).20112012Добавлено в версии 3.15: `%D`, `%F`, `%n`, `%t` и `%:z` были добавлены для [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime).20132014### Техническая подробность20152016В целом, `d.strftime(fmt)` действует как [`time`](https://python-all.ru/3.16/library/time.html#module-time) из модуля `time.strftime(fmt, d.timetuple())`, хотя не все объекты поддерживают метод [`timetuple()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.timetuple).20172018Для методов класса [`datetime.strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) и [`date.strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.strptime) значение по умолчанию равно `1900-01-01T00:00:00.000`: любые компоненты, не указанные в строке формата, будут взяты из значения по умолчанию.20192020> **Примечание**2021>2022> Строки формата без разделителей могут быть неоднозначными для разбора. Например, при `%Y%m%d` строка `2026111` может быть разобрана как `2026-11-01` или как `2026-01-11`. Используйте разделители, чтобы гарантировать, что входные данные разбираются так, как задумано.20232024> **Примечание**2025>2026> При использовании для разбора частичных дат без указания года [`datetime.strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) и [`date.strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.date.strptime) вызовут ошибку при обнаружении 29 февраля, поскольку год по умолчанию 1900 *не является* високосным. Всегда добавляйте високосный год по умолчанию к строкам частичных дат перед разбором.20272028```pycon2029>>> import datetime as dt2030>>> value = "2/29"2031>>> dt.datetime.strptime(value, "%m/%d")2032Traceback (most recent call last):2033...2034ValueError: day 29 must be in range 1..28 for month 2 in year 19002035>>> dt.datetime.strptime(f"1904 {value}", "%Y %m/%d")2036datetime.datetime(1904, 2, 29, 0, 0)2037```20382039Использование `datetime.strptime(date_string, format)` эквивалентно:20402041```python2042datetime(*(time.strptime(date_string, format)[0:6]))2043```20442045за исключением случаев, когда формат включает компоненты долей секунды или информацию о часовом поясе, которые поддерживаются в `datetime.strptime`, но отбрасываются `time.strptime`.20462047Для объектов [`time`](https://python-all.ru/3.16/library/datetime.html#datetime.time) не следует использовать коды формата для года, месяца и дня, поскольку у объектов `time` таких значений нет. Если они всё же используются, для года подставляется 1900, а для месяца и дня – 1.20482049Для объектов [`date`](https://python-all.ru/3.16/library/datetime.html#datetime.date) не следует использовать коды формата для часов, минут, секунд и микросекунд, поскольку у объектов `date` таких значений нет. Если они всё же используются, для них подставляется 0.20502051По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются в выходных данных без изменений, в то время как на других `strftime` может вызвать [`UnicodeError`](https://python-all.ru/3.16/library/exceptions.html#UnicodeError) или вернуть пустую строку.20522053Примечания:205420550. Этот код формата в настоящее время не поддерживается [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime).20561. Поскольку формат зависит от текущей локали, следует проявлять осторожность при построении предположений о выходном значении. Порядок полей различается (например, «месяц/день/год» против «день/месяц/год»), и вывод может содержать не-ASCII символы.20572. Метод [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) может разбирать годы в полном диапазоне \[1, 9999\], но годы \< 1000 должны быть дополнены нулями до 4-значной ширины.20582059 Изменено в версии 3.2: В предыдущих версиях метод [`strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strftime) был ограничен gодами \>= 1900.20602061 Изменено в версии 3.3: В версии 3.2 метод [`strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strftime) был ограничен gодами \>= 1000.20623. При использовании с методом [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) директива `%p` влияет только на поле вывода часа, если директива `%I` используется для разбора часа.20634. В отличие от модуля [`time`](https://python-all.ru/3.16/library/time.html#module-time), модуль `datetime` не поддерживает високосные секунды.20645. При использовании с методом [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) директива `%f` принимает от одной до шести цифр и дополняет нулями справа. `%f` является расширением набора символов форматирования в стандарте C (но реализован отдельно в объектах datetime, поэтому всегда доступен).20656. Для наивного объекта коды форматирования `%z`, `%:z` и `%Z` заменяются пустыми строками.20662067 Для осведомлённого объекта:20682069 **`%z`**20702071 [`utcoffset()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.utcoffset) преобразуется в строку вида `±HHMM[SS[.ffffff]]`, где `HH` – двухсимвольная строка, задающая количество часов смещения UTC, `MM` – двухсимвольная строка, задающая количество минут смещения UTC, `SS` – двухсимвольная строка, задающая количество секунд смещения UTC, а `ffffff` – шестисимвольная строка, задающая количество микросекунд смещения UTC. Часть `ffffff` опускается, если смещение составляет целое число секунд, а части `ffffff` и `SS` опускаются, если смещение составляет целое число минут. Например, если `utcoffset()` возвращает `timedelta(hours=-3, minutes=-30)`, то `%z` заменяется строкой `'-0330'`.20722073 Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.20742075 Изменено в версии 3.7: Когда директива `%z` передаётся методу [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime), смещения UTC могут содержать двоеточие в качестве разделителя между часами, минутами и секундами. Например, как `'+010000'`, так и `'+01:00:00'` будут разобраны как смещение в один час. Кроме того, указание `'Z'` идентично `'+00:00'`.20762077 **`%:z`**20782079 При использовании с [`strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strftime) ведёт себя в точности как `%z`, за исключением того, что между часами, минутами и секундами добавляется разделитель в виде двоеточия.20802081 При использовании с [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) смещение UTC *должно* содержать двоеточие в качестве разделителя между часами, минутами и секундами. Например, `'+01:00:00'` (но *не* `'+010000'`) будет разобрано как смещение в один час. Кроме того, указание `'Z'` идентично `'+00:00'`.20822083 **`%Z`**20842085 В [`strftime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strftime) `%Z` заменяется пустой строкой, если [`tzname()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.tzname) возвращает `None`; в противном случае `%Z` заменяется возвращённым значением, которое должно быть строкой.20862087 [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) принимает только определённые значения для `%Z`:20882089 1. любое значение из `time.tzname` для локали вашей системы2090 2. жёстко заданные значения `UTC` и `GMT`20912092 Так, человек, живущий в Японии, может иметь `JST`, `UTC` и `GMT` в качестве допустимых значений, но, вероятно, не `EST`. Для недопустимых значений будет возбуждено `ValueError`.20932094 Изменено в версии 3.2: Когда директива `%z` передаётся методу [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime), будет создан осведомлённый объект [`datetime`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime). Атрибут `tzinfo` результата будет установлен в экземпляр [`timezone`](https://python-all.ru/3.16/library/datetime.html#datetime.timezone).20957. При использовании с методом [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) `%U` и `%W` используются только в вычислениях, когда указаны день недели и календарный год (`%Y`).20968. Аналогично `%U` и `%W`, `%V` используется только в вычислениях, когда день недели и год по ISO (`%G`) указаны в строке форматирования [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime). Также обратите внимание, что `%G` и `%Y` не являются взаимозаменяемыми.20979. При использовании с методом [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) ведущий ноль является необязательным для форматов `%d`, `%m`, `%H`, `%I`, `%M`, `%S`, `%j`, `%U`, `%W` и `%V`. Формат `%y` требует ведущего нуля.209810. При разборе месяца и дня с помощью [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) всегда включайте год в формат. Если разбираемое значение не содержит года, добавьте явный фиктивный високосный год. В противном случае ваш код возбудит исключение при обнаружении високосного дня, так как год по умолчанию, используемый парсером (1900), не является високосным. Пользователи сталкиваются с этой ошибкой каждый високосный год.20992100 ```pycon2101 >>> month_day = "02/29"2102 >>> dt.datetime.strptime(f"{month_day};1984", "%m/%d;%Y") # Нет ошибки високосного года.2103 datetime.datetime(1984, 2, 29, 0, 0)2104 ```21052106 Изменено в версии 3.15: Использование `%d` без указания года теперь вызывает [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).21072108 Устарело с версии 3.15, будет удалено в версии 3.17: Вызовы [`strptime()`](https://python-all.ru/3.16/library/datetime.html#datetime.datetime.strptime) с использованием строки формата, содержащей `%e` без года, теперь выдают [`DeprecationWarning`](https://python-all.ru/3.16/library/exceptions.html#DeprecationWarning).21092110Сноски21112112\[[1](https://python-all.ru/3.16/library/datetime.html#id1)\]21132114Если, конечно, пренебречь эффектами относительности.21152116\[[2](https://python-all.ru/3.16/library/datetime.html#id2)\]21172118Это соответствует определению пролептического григорианского календаря в книге Дершовица и Рейнгольда *Calendrical Calculations*, где он является базовым календарём для всех вычислений. Смотрите книгу для алгоритмов преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами.21192120\[[3](https://python-all.ru/3.16/library/datetime.html#id3)\]21212122Смотрите [руководство по математике календаря ISO 8601](https://python-all.ru/3.16/library/datetime.html) Р. Х. ван Гента для хорошего объяснения.2123