datetime.md
1> **Источник:** https://python-all.ru/3.7/library/datetime.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) – Основные типы даты и времени89**Исходный код:** [Lib/datetime.py](https://python-all.ru/src/3.7/Lib/datetime.py)1011---1213Модуль [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) предоставляет классы для работы с датами и временем как простыми, так и сложными способами. Хотя арифметика дат и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования вывода и манипуляции. За дополнительными возможностями обращайтесь также к модулям [`time`](https://python-all.ru/3.7/library/time.html#module-time) и [`calendar`](https://python-all.ru/3.7/library/calendar.html#module-calendar).1415Существует два вида объектов даты и времени: «наивные» (naive) и «осведомлённые» (aware).1617Осведомлённый объект обладает достаточными знаниями о применимых алгоритмических и политических корректировках времени, таких как информация о часовом поясе и переходе на летнее время, чтобы определить своё положение относительно других осведомлённых объектов. Осведомлённый объект используется для представления конкретного момента времени, не допускающего неоднозначного толкования [1](https://python-all.ru/3.7/library/datetime.html#id3).1819Наивный объект не содержит достаточно информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Представляет ли наивный объект всемирное координированное время (UTC), местное время или время в каком-то другом часовом поясе – это полностью зависит от программы, точно так же, как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты просты для понимания и работы, ценой игнорирования некоторых аспектов реальности.2021Для приложений, требующих осведомлённые объекты, объекты [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) имеют необязательный атрибут информации о часовом поясе `tzinfo`, который может быть установлен в экземпляр подкласса абстрактного класса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo). Эти объекты [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) содержат информацию о смещении от UTC, название часового пояса и информацию о том, действует ли летнее время. Обратите внимание, что модуль [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) предоставляет только один конкретный класс [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) – класс [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone). Класс [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone) может представлять простые часовые пояса с фиксированным смещением от UTC, такие как сам UTC или североамериканские часовые пояса EST и EDT. Поддержка часовых поясов с более глубоким уровнем детализации остаётся на усмотрение приложения. Правила корректировки времени по всему миру скорее политические, чем рациональные, часто меняются, и не существует стандарта, подходящего для каждого приложения, кроме UTC.2223Модуль [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) экспортирует следующие константы:2425#### `datetime.MINYEAR`2627Наименьший номер года, допустимый в объекте [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). [`MINYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MINYEAR) равен `1`.2829#### `datetime.MAXYEAR`3031Наибольший номер года, допустимый в объекте [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). [`MAXYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MAXYEAR) равен `9999`.3233> **См. также**34>35> **Модуль [`calendar`](https://python-all.ru/3.7/library/calendar.html#module-calendar)**36>37> Общие функции, связанные с календарём.38>39> **Модуль [`time`](https://python-all.ru/3.7/library/time.html#module-time)**40>41> Доступ к времени и преобразования.4243## Доступные типы4445#### `class datetime.date`4647Идеализированная наивная дата, предполагающая, что текущий григорианский календарь действовал всегда и будет действовать всегда. Атрибуты: [`year`](https://python-all.ru/3.7/library/datetime.html#datetime.date.year), [`month`](https://python-all.ru/3.7/library/datetime.html#datetime.date.month) и [`day`](https://python-all.ru/3.7/library/datetime.html#datetime.date.day).4849#### `class datetime.time`5051Идеализированное время, не зависящее от какого-либо конкретного дня, при условии, что каждый день состоит ровно из 24\*60\*60 секунд (понятие «високосных секунд» здесь отсутствует). Атрибуты: [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.time.hour), [`minute`](https://python-all.ru/3.7/library/datetime.html#datetime.time.minute), [`second`](https://python-all.ru/3.7/library/datetime.html#datetime.time.second), [`microsecond`](https://python-all.ru/3.7/library/datetime.html#datetime.time.microsecond) и [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo).5253#### `class datetime.datetime`5455Комбинация даты и времени. Атрибуты: [`year`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.year), [`month`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.month), [`day`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.day), [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.hour), [`minute`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.minute), [`second`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.second), [`microsecond`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.microsecond), и [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo).5657#### `class datetime.timedelta`5859Продолжительность, выражающая разницу между двумя экземплярами [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date), [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) с точностью до микросекунды.6061#### `class datetime.tzinfo`6263Абстрактный базовый класс для объектов информации о часовом поясе. Они используются классами [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) для предоставления настраиваемого понятия корректировки времени (например, для учёта часового пояса и/или летнего времени).6465#### `class datetime.timezone`6667Класс, реализующий абстрактный базовый класс [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) в виде фиксированного смещения от UTC.6869Новое в версии 3.2.7071Объекты этих типов неизменяемы.7273Объекты типа [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) всегда naive.7475Объект типа [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) может быть наивным или осведомлённым. Объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) *d* является осведомлённым, если `d.tzinfo` не равно `None` и `d.tzinfo.utcoffset(d)` не возвращает `None`. Если `d.tzinfo` равно `None`, или если `d.tzinfo` не равно `None`, но `d.tzinfo.utcoffset(d)` возвращает `None`, то *d* является наивным. Объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) *t* является осведомлённым, если `t.tzinfo` не равно `None` и `t.tzinfo.utcoffset(None)` не возвращает `None`. В противном случае *t* является наивным.7677Различие между наивными и осведомлёнными не применяется к объектам [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta).7879Отношения подклассов:8081```python82object83 timedelta84 tzinfo85 timezone86 time87 date88 datetime89```9091## [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) Объекты9293Объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) представляет собой продолжительность, то есть разницу между двумя датами или моментами времени.9495#### `class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)`9697Все аргументы необязательны и по умолчанию равны `0`. Аргументы могут быть целыми числами или числами с плавающей запятой, положительными или отрицательными.9899Внутри хранятся только *days*, *seconds* и *microseconds*. Аргументы преобразуются в эти единицы:100101- Миллисекунда преобразуется в 1000 микросекунд.102- Минута преобразуется в 60 секунд.103- Час преобразуется в 3600 секунд.104- Неделя преобразуется в 7 дней.105106а затем дни, секунды и микросекунды нормализуются так, что представление уникально, с107108- `0 <= microseconds < 1000000`109- `0 <= seconds < 3600*24` (количество секунд в одном дне)110- `-999999999 <= days <= 999999999`111112Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, дробные микросекунды, оставшиеся от всех аргументов, объединяются, и их сумма округляется до ближайшей микросекунды с использованием правила округления до ближайшего чётного (round-half-to-even). Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).113114Если нормализованное значение дней выходит за указанный диапазон, возбуждается [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError).115116Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например,117118```python119>>> from datetime import timedelta120>>> d = timedelta(microseconds=-1)121>>> (d.days, d.seconds, d.microseconds)122(-1, 86399, 999999)123```124125Атрибуты класса:126127#### `timedelta.min`128129Наиболее отрицательный объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), `timedelta(-999999999)`.130131#### `timedelta.max`132133Наиболее положительный объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), `timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)`.134135#### `timedelta.resolution`136137Наименьшая возможная разница между неравными [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) объектами, `timedelta(microseconds=1)`.138139Обратите внимание, что из-за нормализации `timedelta.max` \> `-timedelta.min`. `-timedelta.max` не представим как объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta).140141Атрибуты экземпляра (только для чтения):142143| Атрибут | Значение |144| --- | --- |145| `days` | От -999999999 до 999999999 включительно |146| `seconds` | От 0 до 86399 включительно |147| `microseconds` | От 0 до 999999 включительно |148149Поддерживаемые операции:150151| Операция | Результат |152| --- | --- |153| `t1 = t2 + t3` | Сумма *t2* и *t3*. После этого *t1*-*t2* == *t3* и *t1*-*t3* == *t2* истинны. (1) |154| `t1 = t2 - t3` | Разность *t2* и *t3*. После этого *t1* == *t2* - *t3* и *t2* == *t1* + *t3* истинны. (1)(6) |155| `t1 = t2 * i or t1 = i * t2` | Дельта, умноженная на целое число. После этого *t1* // i == *t2* истинно при условии `i != 0`. |156| | В общем случае, *t1* \* i == *t1* \* (i-1) + *t1* является истинным. (1) |157| `t1 = t2 * f or t1 = f * t2` | Дельта, умноженная на число с плавающей запятой. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |158| `f = t2 / t3` | Деление (3) общей длительности *t2* на единицу интервала *t3*. Возвращает объект [`float`](https://python-all.ru/3.7/library/functions.html#float). |159| `t1 = t2 / f or t1 = t2 / i` | Дельта, делённая на число с плавающей запятой или целое число. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |160| `t1 = t2 // i` или `t1 = t2 // t3` | Вычисляется целая часть от деления, а остаток (если есть) отбрасывается. Во втором случае возвращается целое число. (3) |161| `t1 = t2 % t3` | Остаток вычисляется как объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta). (3) |162| `q, r = divmod(t1, t2)` | Вычисляет частное и остаток: `q = t1 // t2` (3) и `r = t1 % t2`. q – целое число, а r – объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta). |163| `+t1` | Возвращает объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) с тем же значением. (2) |164| `-t1` | эквивалентно [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta)(-*t1.days*, -*t1.seconds*, -*t1.microseconds*), и *t1* \* -1. (1)(4) |165| `abs(t)` | эквивалентно +*t*, когда `t.days >= 0`, и -*t*, когда `t.days < 0`. (2) |166| `str(t)` | Возвращает строку вида `[D day[s], ][H]H:MM:SS[.UUUUUU]`, где D отрицательно для отрицательного `t`. (5) |167| `repr(t)` | Возвращает строковое представление объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) в виде вызова конструктора с каноническими значениями атрибутов. |168169Примечания:1701711. Это точное вычисление, но может произойти переполнение.1722. Это точное вычисление и не может вызвать переполнение.1733. Деление на 0 вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.7/library/exceptions.html#ZeroDivisionError).1744. -*timedelta.max* не представимо в виде объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta).1755. Строковые представления объектов [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных объектов timedelta. Например:176177 ```python178 >>> timedelta(hours=-5)179 datetime.timedelta(days=-1, seconds=68400)180 >>> print(_)181 -1 day, 19:00:00182 ```1836. Выражение `t2 - t3` всегда будет равно выражению `t2 + (-t3)`, за исключением случая, когда t3 равно `timedelta.max`; в этом случае первое выражение даст результат, а второе вызовет переполнение.184185В дополнение к операциям, перечисленным выше, объекты [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) поддерживают определённые сложения и вычитания с объектами [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) и [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) (см. ниже).186187Изменено в версии 3.2: Теперь поддерживаются целочисленное деление и обычное деление объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) на другой объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), а также операции взятия остатка и функция [`divmod()`](https://python-all.ru/3.7/library/functions.html#divmod). Теперь поддерживаются обычное деление и умножение объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) на объект [`float`](https://python-all.ru/3.7/library/functions.html#float).188189Поддерживается сравнение объектов [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), при этом объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), представляющий меньшую продолжительность, считается меньшим timedelta. Чтобы предотвратить возврат к сравнению по умолчанию по адресу объекта при сравнении разнотипных объектов, при сравнении объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) с объектом другого типа вызывается [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращается [`False`](https://python-all.ru/3.7/library/constants.html#False) или [`True`](https://python-all.ru/3.7/library/constants.html#True) соответственно.190191Объекты [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) являются [хешируемыми](https://python-all.ru/3.7/glossary.html#term-hashable) (могут использоваться в качестве ключей словаря), поддерживают эффективную сериализацию и в логическом контексте объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) считается истинным тогда и только тогда, когда он не равен `timedelta(0)`.192193Методы экземпляра:194195#### `timedelta.total_seconds()`196197Возвращает общее количество секунд, содержащихся в интервале. Эквивалентно `td / timedelta(seconds=1)`. Для единиц интервала, отличных от секунд, используйте форму деления напрямую (например, `td / timedelta(microseconds=1)`).198199Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет точность до микросекунд.200201Новое в версии 3.2.202203Пример использования:204205```python206>>> from datetime import timedelta207>>> year = timedelta(days=365)208>>> another_year = timedelta(weeks=40, days=84, hours=23,209... minutes=50, seconds=600) # составляет 365 дней210>>> year.total_seconds()21131536000.0212>>> year == another_year213True214>>> ten_years = 10 * year215>>> ten_years, ten_years.days // 365216(datetime.timedelta(days=3650), 10)217>>> nine_years = ten_years - year218>>> nine_years, nine_years.days // 365219(datetime.timedelta(days=3285), 9)220>>> three_years = nine_years // 3221>>> three_years, three_years.days // 365222(datetime.timedelta(days=1095), 3)223>>> abs(three_years - ten_years) == 2 * three_years + year224True225```226227## [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) Объекты228229Объект [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) представляет дату (год, месяц и день) в идеализированном календаре – текущем григорианском календаре, бесконечно расширенном в обоих направлениях. 1 января 1 года называется днём номер 1, 2 января 1 года – днём номер 2 и так далее. Это соответствует определению «пролептического григорианского» календаря в книге Дершовица и Рейнгольда «Календарные вычисления», где он является базовым календарём для всех вычислений. За алгоритмами преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами обращайтесь к этой книге.230231#### `class datetime.date(year, month, day)`232233Все аргументы обязательны. Аргументы должны быть целыми числами в следующих диапазонах:234235- `MINYEAR <= year <= MAXYEAR`236- `1 <= month <= 12`237- `1 <= day <= number of days in the given month and year`238239Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError).240241Другие конструкторы – все методы класса:242243#### `classmethod date.today()`244245Возвращает текущую локальную дату. Это эквивалентно `date.fromtimestamp(time.time())`.246247#### `classmethod date.fromtimestamp(timestamp)`248249Возвращает локальную дату, соответствующую временной метке POSIX, например такой, какую возвращает [`time.time()`](https://python-all.ru/3.7/library/time.html#time.time). Это может вызвать [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError), если метка времени выходит за диапазон значений, поддерживаемых платформенной функцией C `localtime()`, и [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError) при ошибке `localtime()`. Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что в системах, не соответствующих POSIX, которые включают високосные секунды в понятие временной метки, високосные секунды игнорируются функцией [`fromtimestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.fromtimestamp).250251Изменено в версии 3.3: Вызывает [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемого функцией `localtime()` платформы C. Вызывает [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) при ошибке `localtime()`.252253#### `classmethod date.fromordinal(ordinal)`254255Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января года 1 имеет порядковый номер 1. [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) возбуждается, если не `1 <= ordinal <= date.max.toordinal()`. Для любой даты *d*, `date.fromordinal(d.toordinal()) == d`.256257#### `classmethod date.fromisoformat(date_string)`258259Возвращает [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date), соответствующий *строке даты* в формате, выдаваемом [`date.isoformat()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.isoformat). В частности, эта функция поддерживает строки в формате(ах) `YYYY-MM-DD`.260261> **Внимание**262>263> Она не поддерживает разбор произвольных строк ISO 8601 – она предназначена только как обратная операция для [`date.isoformat()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.isoformat).264265Добавлено в версии 3.7.266267Атрибуты класса:268269#### `date.min`270271Самая ранняя представимая дата, `date(MINYEAR, 1, 1)`.272273#### `date.max`274275Самая поздняя представимая дата, `date(MAXYEAR, 12, 31)`.276277#### `date.resolution`278279Наименьшая возможная разница между неравными объектами дат, `timedelta(days=1)`.280281Атрибуты экземпляра (только для чтения):282283#### `date.year`284285От [`MINYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MAXYEAR) включительно.286287#### `date.month`288289От 1 до 12 включительно.290291#### `date.day`292293От 1 до количества дней в указанном месяце указанного года.294295Поддерживаемые операции:296297| Операция | Результат |298| --- | --- |299| `date2 = date1 + timedelta` | *date2* отстоит на `timedelta.days` дней от *date1*. (1) |300| `date2 = date1 - timedelta` | Вычисляет *date2* так, что `date2 + timedelta == date1`. (2) |301| `timedelta = date1 - date2` | (3) |302| `date1 < date2` | *date1* считается меньше *date2*, если *date1* предшествует *date2* во времени. (4) |303304Примечания:3053061. *date2* перемещается вперед по времени, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. После этого `date2 - date1 == timedelta.days`. `timedelta.seconds` и `timedelta.microseconds` игнорируются. [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError) возбуждается, если `date2.year` будет меньше [`MINYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MAXYEAR).3072. `timedelta.seconds` и `timedelta.microseconds` игнорируются.3083. Это точная операция и не может вызвать переполнение. timedelta.seconds и timedelta.microseconds равны 0, и после этого date2 + timedelta == date1.3094. Иными словами, `date1 < date2` тогда и только тогда, когда `date1.toordinal() < date2.toordinal()`. Сравнение дат возбуждает [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError), если другой операнд не является объектом [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date). Однако, `NotImplemented` возвращается вместо этого, если другой операнд имеет атрибут `timetuple()`. Этот перехватчик дает другим типам дат возможность реализовать сравнение смешанных типов. Если нет, то когда объект [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) сравнивается с объектом другого типа, [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError) возбуждается, если только сравнение не является `==` или `!=`. В последних случаях возвращается [`False`](https://python-all.ru/3.7/library/constants.html#False) или [`True`](https://python-all.ru/3.7/library/constants.html#True) соответственно.310311Даты можно использовать в качестве ключей словаря. В логическом контексте все объекты [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) считаются истинными.312313Методы экземпляра:314315#### `date.replace(year=self.year, month=self.month, day=self.day)`316317Возвращает дату с теми же значениями, за исключением параметров, которым присваиваются новые значения указанными именованными аргументами. Например, если `d == date(2002, 12, 31)`, то `d.replace(day=26) == date(2002, 12, 26)`.318319#### `date.timetuple()`320321Возвращает [`time.struct_time`](https://python-all.ru/3.7/library/time.html#time.struct_time), аналогичный возвращаемому [`time.localtime()`](https://python-all.ru/3.7/library/time.html#time.localtime). Часы, минуты и секунды равны 0, а флаг DST равен −1. `d.timetuple()` эквивалентен `time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))`, где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – номер дня в текущем году, начиная с `1` для 1 января.322323#### `date.toordinal()`324325Возвращает пролептический григорианский порядковый номер даты, где 1 января года 1 имеет номер 1. Для любого объекта [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) *d*, `date.fromordinal(d.toordinal()) == d`.326327#### `date.weekday()`328329Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. Например, `date(2002, 12, 4).weekday() == 2`, среда. См. также [`isoweekday()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.isoweekday).330331#### `date.isoweekday()`332333Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. Например, `date(2002, 12, 4).isoweekday() == 3`, среда. См. также [`weekday()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.weekday), [`isocalendar()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.isocalendar).334335#### `date.isocalendar()`336337Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO).338339ISO-календарь – широко используемый вариант григорианского календаря. См. [https://www.staff.science.uu.nl/~gent0113/calendar/isocalendar.htm](https://python-all.ru/3.7/library/datetime.html) для подробного объяснения.340341ISO-год состоит из 52 или 53 полных недель, при этом неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя ISO-года – это первая (григорианская) календарная неделя года, в которую входит четверг. Она называется неделей номер 1, и ISO-год этого четверга совпадает с его григорианским годом.342343Например, 2004 год начинается в четверг, поэтому первая неделя ISO-года 2004 начинается в понедельник, 29 декабря 2003 года, и заканчивается в воскресенье, 4 января 2004 года, так что `date(2003, 12, 29).isocalendar() == (2004, 1, 1)` и `date(2004, 1, 4).isocalendar() == (2004, 1, 7)`.344345#### `date.isoformat()`346347Возвращает строку, представляющую дату в формате ISO 8601, ‘YYYY-MM-DD’. Например, `date(2002, 12, 4).isoformat() == '2002-12-04'`.348349#### `date.__str__()`350351Для даты *d*, `str(d)` эквивалентен `d.isoformat()`.352353#### `date.ctime()`354355Возвращает строку, представляющую дату, например `date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'`. `d.ctime()` эквивалентен `time.ctime(time.mktime(d.timetuple()))` на платформах, где встроенная функция C `ctime()` (которую вызывает [`time.ctime()`](https://python-all.ru/3.7/library/time.html#time.ctime), но которую [`date.ctime()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.ctime) не вызывает) соответствует стандарту C.356357#### `date.strftime(format)`358359Возвращает строку, представляющую дату, задаваемую явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. Полный список директив форматирования см. в [поведении strftime() и strptime()](https://python-all.ru/3.7/library/datetime.html#strftime-strptime-behavior).360361#### `date.__format__(format)`362363То же, что и [`date.strftime()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.strftime). Это позволяет задать строку формата для объекта [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) в [форматированных строковых литералах](https://python-all.ru/3.7/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.7/library/stdtypes.html#str.format). Полный список директив форматирования см. в [Поведение strftime() и strptime()](https://python-all.ru/3.7/library/datetime.html#strftime-strptime-behavior).364365Пример подсчёта дней до события:366367```python368>>> import time369>>> from datetime import date370>>> today = date.today()371>>> today372datetime.date(2007, 12, 5)373>>> today == date.fromtimestamp(time.time())374True375>>> my_birthday = date(today.year, 6, 24)376>>> if my_birthday < today:377... my_birthday = my_birthday.replace(year=today.year + 1)378>>> my_birthday379datetime.date(2008, 6, 24)380>>> time_to_birthday = abs(my_birthday - today)381>>> time_to_birthday.days382202383```384385Пример работы с [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date):386387```pycon388>>> from datetime import date389>>> d = date.fromordinal(730920) # 730920-й день после 1.1.0001390>>> d391datetime.date(2002, 3, 11)392>>> t = d.timetuple()393>>> for i in t: 394... print(i)3952002 # year3963 # month39711 # day3980399040004010 # weekday (0 = Monday)40270 # 70th day in the year403-1404>>> ic = d.isocalendar()405>>> for i in ic: 406... print(i)4072002 # ISO year40811 # ISO week number4091 # ISO day number ( 1 = Monday )410>>> d.isoformat()411'2002-03-11'412>>> d.strftime("%d/%m/%y")413'11/03/02'414>>> d.strftime("%A %d. %B %Y")415'Monday 11. March 2002'416>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")417'The day is 11, the month is March.'418```419420## [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) Объекты421422Объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) – это единый объект, содержащий всю информацию из объекта [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) и объекта [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time). Как и объект [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) предполагает текущий григорианский календарь, расширенный в обе стороны; как и объект time, [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) предполагает, что в каждом дне ровно 3600\*24 секунд.423424Конструктор:425426#### `class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)`427428Аргументы year, month и day являются обязательными. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo). Остальные аргументы должны быть целыми числами в следующих диапазонах:429430- `MINYEAR <= year <= MAXYEAR`,431- `1 <= month <= 12`,432- `1 <= day <= number of days in the given month and year`,433- `0 <= hour < 24`,434- `0 <= minute < 60`,435- `0 <= second < 60`,436- `0 <= microsecond < 1000000`,437- `fold in [0, 1]`.438439Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError).440441Новое в версии 3.6: Добавлен аргумент `fold`.442443Другие конструкторы – все методы класса:444445#### `classmethod datetime.today()`446447Возвращает текущую локальную дату и время с [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) `None`. Это эквивалентно `datetime.fromtimestamp(time.time())`. См. также [`now()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.now), [`fromtimestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fromtimestamp).448449#### `classmethod datetime.now(tz=None)`450451Возвращает текущую локальную дату и время. Если необязательный аргумент *tz* равен `None` или не указан, это подобно [`today()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.today), но, если возможно, предоставляет большую точность, чем можно получить через временную метку [`time.time()`](https://python-all.ru/3.7/library/time.html#time.time) (например, это может быть возможно на платформах, предоставляющих функцию C `gettimeofday()`).452453Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), и текущие дата и время преобразуются в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcnow().replace(tzinfo=tz))`. См. также [`today()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.today), [`utcnow()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.utcnow).454455#### `classmethod datetime.utcnow()`456457Возвращает текущие дату и время UTC с [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) `None`. Это подобно [`now()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.now), но возвращает текущие дату и время UTC как наивный объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). Текущую дату и время UTC с таймзоной можно получить, вызвав `datetime.now(timezone.utc)`. См. также [`now()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.now).458459#### `classmethod datetime.fromtimestamp(timestamp, tz=None)`460461Возвращает локальные дату и время, соответствующие метке времени POSIX, такой как возвращается [`time.time()`](https://python-all.ru/3.7/library/time.html#time.time). Если необязательный аргумент *tz* равен `None` или не указан, метка времени преобразуется в локальные дату и время платформы, и возвращаемый объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) является наивным.462463Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), и временная метка преобразуется в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))`.464465[`fromtimestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fromtimestamp) может возбуждать [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError), если временная метка выходит за пределы диапазона значений, поддерживаемых функциями C платформы `localtime()` или `gmtime()`, и [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError) при сбое `localtime()` или `gmtime()`. Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что в не-POSIX системах, которые включают високосные секунды в понятие временной метки, високосные секунды игнорируются [`fromtimestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fromtimestamp), и тогда возможно иметь две временные метки, отличающиеся на секунду, которые дают одинаковые объекты [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). См. также [`utcfromtimestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.utcfromtimestamp).466467Изменено в версии 3.3: Возбуждает [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError), если метка времени выходит за диапазон значений, поддерживаемых платформенными функциями C `localtime()` или `gmtime()`. Возбуждает [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) при ошибке `localtime()` или `gmtime()`.468469Изменено в версии 3.6: [`fromtimestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fromtimestamp) может возвращать экземпляры с [`fold`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fold), установленным в 1.470471#### `classmethod datetime.utcfromtimestamp(timestamp)`472473Возвращает UTC [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), соответствующий временной метке POSIX, с [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) `None`. Это может вызвать [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError), если временная метка выходит за пределы диапазона значений, поддерживаемого функцией `gmtime()` платформы C, и [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError) при сбое `gmtime()`. Обычно это ограничено годами с 1970 по 2038.474475Чтобы получить осведомлённый объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), вызовите [`fromtimestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fromtimestamp):476477```python478datetime.fromtimestamp(timestamp, timezone.utc)479```480481На платформах, совместимых с POSIX, это эквивалентно следующему выражению:482483```python484datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)485```486487за исключением того, что последняя формула всегда поддерживает полный диапазон лет: от [`MINYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MAXYEAR) включительно.488489Изменено в версии 3.3: Вызывает [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемого функцией `gmtime()` платформы C. Вызывает [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) при ошибке `gmtime()`.490491#### `classmethod datetime.fromordinal(ordinal)`492493Возвращает [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1. [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) вызывается, если только `1 <= ordinal <= datetime.max.toordinal()`. Час, минута, секунда и микросекунда результата равны 0, а [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) `None`.494495#### `classmethod datetime.combine(date, time, tzinfo=self.tzinfo)`496497Возвращает новый объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), чьи компоненты даты равны компонентам заданного объекта [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date), а компоненты времени равны компонентам заданного объекта [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time). Если указан аргумент *tzinfo*, его значение используется для установки атрибута [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) результата, в противном случае используется атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo) аргумента *time*.498499Для любого объекта [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) *d* `d == datetime.combine(d.date(), d.time(), d.tzinfo)`. Если date является объектом [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), его компоненты времени и атрибуты [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) игнорируются.500501Изменено в версии 3.6: Добавлен аргумент *tzinfo*.502503#### `classmethod datetime.fromisoformat(date_string)`504505Возвращает [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime), соответствующий *date\_string* в одном из форматов, выдаваемых [`date.isoformat()`](https://python-all.ru/3.7/library/datetime.html#datetime.date.isoformat) и [`datetime.isoformat()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.isoformat). В частности, эта функция поддерживает строки в формате(ах) `YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]`, где `*` может соответствовать любому одиночному символу.506507> **Внимание**508>509> Это не поддерживает разбор произвольных строк ISO 8601 – он предназначен только как обратная операция [`datetime.isoformat()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.isoformat). Более полнофункциональный анализатор ISO 8601, `dateutil.parser.isoparse`, доступен в стороннем пакете [dateutil](https://python-all.ru/3.7/library/datetime.html).510511Добавлено в версии 3.7.512513#### `classmethod datetime.strptime(date_string, format)`514515Возвращает [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), соответствующий *date\_string*, проанализированный в соответствии с *format*. Это эквивалентно `datetime(*(time.strptime(date_string, format)[0:6]))`. [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) вызывается, если date\_string и format не могут быть проанализированы [`time.strptime()`](https://python-all.ru/3.7/library/time.html#time.strptime) или если он возвращает значение, не являющееся кортежем времени. Полный список директив форматирования см. в [Поведение strftime() и strptime()](https://python-all.ru/3.7/library/datetime.html#strftime-strptime-behavior).516517Атрибуты класса:518519#### `datetime.min`520521Самое раннее представимое [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), `datetime(MINYEAR, 1, 1, tzinfo=None)`.522523#### `datetime.max`524525Самое позднее представимое [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), `datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)`.526527#### `datetime.resolution`528529Наименьшая возможная разница между неравными [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) объектами, `timedelta(microseconds=1)`.530531Атрибуты экземпляра (только для чтения):532533#### `datetime.year`534535От [`MINYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MAXYEAR) включительно.536537#### `datetime.month`538539От 1 до 12 включительно.540541#### `datetime.day`542543От 1 до количества дней в указанном месяце указанного года.544545#### `datetime.hour`546547В `range(24)`.548549#### `datetime.minute`550551В `range(60)`.552553#### `datetime.second`554555В `range(60)`.556557#### `datetime.microsecond`558559В `range(1000000)`.560561#### `datetime.tzinfo`562563Объект, переданный в качестве аргумента *tzinfo* конструктору [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), или `None`, если ничего не было передано.564565#### `datetime.fold`566567В `[0, 1]`. Используется для устранения неоднозначности местного времени в течение повторяющегося интервала. (Повторяющийся интервал возникает, когда часы переводятся назад в конце перехода на летнее время или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значение 0 (1) представляет более ранний (поздний) из двух моментов с одинаковым представлением местного времени.568569Новое в версии 3.6.570571Поддерживаемые операции:572573| Операция | Результат |574| --- | --- |575| `datetime2 = datetime1 + timedelta` | (1) |576| `datetime2 = datetime1 - timedelta` | (2) |577| `timedelta = datetime1 - datetime2` | (3) |578| `datetime1 < datetime2` | Сравнивает [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) с [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). (4) |5795801. datetime2 – это продолжительность timedelta, вычтенная из datetime1, сдвиг во времени вперед, если `timedelta.days` \> 0, или назад, если `timedelta.days` \< 0. Результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo), что и исходный datetime, и datetime2 - datetime1 == timedelta. [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError) вызывается, если datetime2.year будет меньше [`MINYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.7/library/datetime.html#datetime.MAXYEAR). Обратите внимание, что корректировка часового пояса не производится, даже если входные данные являются осведомленным объектом.5812. Вычисляет datetime2 таким образом, что datetime2 + timedelta == datetime1. Как и в случае сложения, результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo), что и входной datetime, и корректировка часового пояса не производится, даже если входной объект является осведомленным.5823. Вычитание [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) из [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) определено только в том случае, если оба операнда наивны или оба осведомлены. Если один осведомлен, а другой наивен, вызывается [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError).583584 Если оба наивны, или оба осведомлены и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo), атрибуты [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) игнорируются, и результатом является объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) *t* такой, что `datetime2 + t == datetime1`. В этом случае корректировка часового пояса не производится.585586 Если оба осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo), `a-b` ведёт себя так, как если бы *a* и *b* были сначала преобразованы в наивные даты и время в UTC. Результат – `(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`, за исключением того, что реализация никогда не вызывает переполнения.5874. *datetime1* считается меньше *datetime2*, когда *datetime1* предшествует *datetime2* по времени.588589 Если один сравниваемый объект наивен, а другой осведомлен, [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError) вызывается при попытке упорядоченного сравнения. При сравнении на равенство наивные экземпляры никогда не равны осведомленным.590591 Если оба сравниваемых осведомлены и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) игнорируется, и сравниваются базовые даты и время. Если оба сравниваемых осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo), сравниваемые сначала корректируются путем вычитания их смещений UTC (полученных из `self.utcoffset()`).592593 Изменено в версии 3.3: Сравнение на равенство между наивными и осведомленными экземплярами [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) не вызывает [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError).594595 > **Примечание**596 >597 > Чтобы предотвратить возврат к схеме сравнения по умолчанию, основанной на адресах объектов, сравнение datetime обычно вызывает [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError), если другой сравниваемый объект не является объектом [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). Однако `NotImplemented` возвращается вместо этого, если другой сравниваемый объект имеет атрибут `timetuple()`. Этот хук дает другим видам объектов даты возможность реализовать смешанное сравнение. Если нет, когда объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) сравнивается с объектом другого типа, [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError) вызывается, если только сравнение не является `==` или `!=`. Последние случаи возвращают [`False`](https://python-all.ru/3.7/library/constants.html#False) или [`True`](https://python-all.ru/3.7/library/constants.html#True) соответственно.598599Объекты [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) можно использовать в качестве ключей словаря. В логическом контексте все объекты [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) считаются истинными.600601Методы экземпляра:602603#### `datetime.date()`604605Возвращает объект [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) с тем же годом, месяцем и днём.606607#### `datetime.time()`608609Возвращает объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) с теми же значениями часов, минут, секунд, микросекунд и fold. [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) `None`. См. также метод [`timetz()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.timetz).610611Изменено в версии 3.6: Значение fold копируется в возвращаемый объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time).612613#### `datetime.timetz()`614615Возвращает объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) с теми же значениями часов, минут, секунд, микросекунд, fold и tzinfo. См. также метод [`time()`](https://python-all.ru/3.7/library/time.html#module-time).616617Изменено в версии 3.6: Значение fold копируется в возвращаемый объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time).618619#### `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)`620621Возвращает datetime с теми же атрибутами, за исключением тех атрибутов, которым заданы новые значения указанными именованными аргументами. Обратите внимание, что `tzinfo=None` можно указать, чтобы создать наивный datetime из осведомленного datetime без преобразования данных даты и времени.622623Новое в версии 3.6: Добавлен аргумент `fold`.624625#### `datetime.astimezone(tz=None)`626627Возвращает объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) с новым атрибутом [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) *tz*, корректируя данные даты и времени так, чтобы результат соответствовал тому же времени UTC, что и *self*, но в местном времени *tz*.628629Если указан, *tz* должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), и его методы [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.utcoffset) и [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.dst) не должны возвращать `None`. Если *self* наивен, предполагается, что он представляет время в системном часовом поясе.630631Если вызван без аргументов (или с `tz=None`), для целевого часового пояса предполагается системный местный часовой пояс. Атрибут `.tzinfo` преобразованного экземпляра datetime будет установлен в экземпляр [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone) с именем зоны и смещением, полученными от ОС.632633Если `self.tzinfo` равно *tz*, `self.astimezone(tz)` равно *self*: никакой корректировки данных о дате или времени не выполняется. В противном случае результатом является местное время в часовом поясе *tz*, представляющее то же UTC-время, что и *self*: после `astz = dt.astimezone(tz)` `astz - astz.utcoffset()` будет иметь те же данные о дате и времени, что и `dt - dt.utcoffset()`.634635Если требуется просто прикрепить объект часового пояса *tz* к datetime *dt* без корректировки данных даты и времени, используйте `dt.replace(tzinfo=tz)`. Если требуется просто удалить объект часового пояса из осведомленного datetime *dt* без преобразования данных даты и времени, используйте `dt.replace(tzinfo=None)`.636637Обратите внимание, что метод по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc) можно переопределить в подклассе [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), чтобы повлиять на результат, возвращаемый [`astimezone()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.astimezone). Если не учитывать ошибки, [`astimezone()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.astimezone) работает следующим образом:638639```python640def astimezone(self, tz):641 if self.tzinfo is tz:642 return self643 # Преобразует self в UTC и присоединяет новый объект временной зоны.644 utc = (self - self.utcoffset()).replace(tzinfo=tz)645 # Преобразует из UTC в местное время tz.646 return tz.fromutc(utc)647```648649Изменено в версии 3.3: *tz* теперь можно опускать.650651Изменено в версии 3.6: Метод [`astimezone()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.astimezone) теперь можно вызывать для наивных экземпляров, которые считаются представляющими системное местное время.652653#### `datetime.utcoffset()`654655Если [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(self)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) с величиной менее одного дня.656657Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.658659#### `datetime.dst()`660661Если [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращается `None`, иначе возвращается `self.tzinfo.dst(self)`, и возбуждается исключение, если последний не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) с величиной меньше одного дня.662663Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.664665#### `datetime.tzname()`666667Если [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращается `None`, иначе возвращается `self.tzinfo.tzname(self)`, возбуждается исключение, если последний не возвращает `None` или строковый объект,668669#### `datetime.timetuple()`670671Возвращает [`time.struct_time`](https://python-all.ru/3.7/library/time.html#time.struct_time), такой как возвращаемый [`time.localtime()`](https://python-all.ru/3.7/library/time.html#time.localtime). `d.timetuple()` эквивалентен `time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))`, где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – номер дня в текущем году, начиная с `1` для 1 января. Флаг `tm_isdst` результата устанавливается в соответствии с методом [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.dst): [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo) `None` или [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.dst) возвращает `None`, `tm_isdst` устанавливается в `-1`; иначе если [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.dst) возвращает ненулевое значение, `tm_isdst` устанавливается в `1`; иначе `tm_isdst` устанавливается в `0`.672673#### `datetime.utctimetuple()`674675Если экземпляр [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) *d* наивен, это то же самое, что `d.timetuple()`, за исключением того, что `tm_isdst` принудительно устанавливается в 0 независимо от того, что возвращает `d.dst()`. Переход на летнее время никогда не действует для времени UTC.676677Если *d* является aware, *d* нормализуется к UTC путём вычитания `d.utcoffset()`, и возвращается [`time.struct_time`](https://python-all.ru/3.7/library/time.html#time.struct_time) для нормализованного времени. `tm_isdst` принудительно устанавливается в 0. Обратите внимание, что может быть вызвано [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError), если *d*.year было `MINYEAR` или `MAXYEAR` и корректировка UTC выходит за границу года.678679#### `datetime.toordinal()`680681Возвращает пролептический григорианский порядковый номер даты. То же, что `self.date().toordinal()`.682683#### `datetime.timestamp()`684685Возвращает метку времени POSIX, соответствующую экземпляру [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). Возвращаемое значение – [`float`](https://python-all.ru/3.7/library/functions.html#float), аналогичное тому, что возвращается [`time.time()`](https://python-all.ru/3.7/library/time.html#time.time).686687Предполагается, что наивные экземпляры [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) представляют местное время, и этот метод полагается на платформенную функцию C `mktime()` для выполнения преобразования. Поскольку [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) поддерживает более широкий диапазон значений, чем `mktime()` на многих платформах, этот метод может вызывать [`OverflowError`](https://python-all.ru/3.7/library/exceptions.html#OverflowError) для моментов времени, далёких в прошлом или будущем.688689Для осознанных экземпляров [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) возвращаемое значение вычисляется как:690691```python692(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()693```694695Новое в версии 3.3.696697Изменено в версии 3.6: Метод [`timestamp()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.timestamp) использует атрибут [`fold`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fold) для устранения неоднозначности моментов времени в течение повторяющегося интервала.698699> **Примечание**700>701> Нет метода для получения метки времени POSIX напрямую из наивного экземпляра [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), представляющего время UTC. Если приложение использует это соглашение, а системный часовой пояс не установлен на UTC, можно получить метку времени POSIX, передав `tzinfo=timezone.utc`:702>703> ```python704> timestamp = dt.replace(tzinfo=timezone.utc).timestamp()705> ```706>707> или вычислив метку напрямую:708>709> ```python710> timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)711> ```712713#### `datetime.weekday()`714715Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. То же, что `self.date().weekday()`. См. также [`isoweekday()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.isoweekday).716717#### `datetime.isoweekday()`718719Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. То же, что `self.date().isoweekday()`. См. также [`weekday()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.weekday), [`isocalendar()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.isocalendar).720721#### `datetime.isocalendar()`722723Возвращает кортеж из 3 элементов: (ISO год, ISO номер недели, ISO день недели). То же, что `self.date().isocalendar()`.724725#### `datetime.isoformat(sep='T', timespec='auto')`726727Возвращает строку, представляющую дату и время в формате ISO 8601: YYYY-MM-DDTHH:MM:SS.ffffff или, если [`microsecond`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.microsecond) равно 0, YYYY-MM-DDTHH:MM:SS728729Если [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.utcoffset) не возвращает `None`, добавляется строка, указывающая смещение UTC: YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM\[:SS\[.ffffff\]\] или, если [`microsecond`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.microsecond) равно 0, YYYY-MM-DDTHH:MM:SS+HH:MM\[:SS\[.ffffff\]\].730731Необязательный аргумент *sep* (по умолчанию `'T'`) – это односимвольный разделитель, помещаемый между частями даты и времени результата. Например,732733```python734>>> from datetime import tzinfo, timedelta, datetime735>>> class TZ(tzinfo):736... def utcoffset(self, dt): return timedelta(minutes=-399)737...738>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')739'2002-12-25 00:00:00-06:39'740```741742Необязательный аргумент *timespec* указывает количество дополнительных компонентов времени, которые нужно включить (по умолчанию `'auto'`). Он может быть одним из следующих:743744- `'auto'`: То же, что и `'seconds'`, если [`microsecond`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.microsecond) равно 0, иначе то же, что и `'microseconds'`.745- `'hours'`: включает [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.hour) в двухзначном формате HH.746- `'minutes'`: включает [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.hour) и [`minute`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.minute) в формате HH:MM.747- `'seconds'`: включает [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.hour), [`minute`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.minute) и [`second`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.second) в формате HH:MM:SS.748- `'milliseconds'`: включает полное время, но усекает дробную часть секунд до миллисекунд. Формат HH:MM:SS.sss.749- `'microseconds'`: включает полное время в формате HH:MM:SS.ffffff.750751> **Примечание**752>753> Исключённые компоненты времени усекаются, а не округляются.754755[`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) будет вызвано при недопустимом аргументе *timespec*.756757```python758>>> from datetime import datetime759>>> datetime.now().isoformat(timespec='minutes') 760'2002-12-25T00:00'761>>> dt = datetime(2015, 1, 1, 12, 30, 59, 0)762>>> dt.isoformat(timespec='microseconds')763'2015-01-01T12:30:59.000000'764```765766Новое в версии 3.6: Добавлен аргумент *timespec*.767768#### `datetime.__str__()`769770Для экземпляра [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) *d*, `str(d)` эквивалентно `d.isoformat(' ')`.771772#### `datetime.ctime()`773774Возвращает строку, представляющую дату и время, например `datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'`. `d.ctime()` эквивалентно `time.ctime(time.mktime(d.timetuple()))` на платформах, где нативная функция C `ctime()` (которую вызывает [`time.ctime()`](https://python-all.ru/3.7/library/time.html#time.ctime), но не вызывает [`datetime.ctime()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.ctime)) соответствует стандарту C.775776#### `datetime.strftime(format)`777778Возвращает строку, представляющую дату и время, управляемую явной строкой формата. Полный список директив форматирования см. в разделе [Поведение strftime() и strptime()](https://python-all.ru/3.7/library/datetime.html#strftime-strptime-behavior).779780#### `datetime.__format__(format)`781782То же, что [`datetime.strftime()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.strftime). Это позволяет указывать строку формата для объекта [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) в [f-строках](https://python-all.ru/3.7/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.7/library/stdtypes.html#str.format). Полный список директив форматирования см. в разделе [Поведение strftime() и strptime()](https://python-all.ru/3.7/library/datetime.html#strftime-strptime-behavior).783784Примеры работы с объектами datetime:785786```pycon787>>> from datetime import datetime, date, time788>>> # Использование datetime.combine()789>>> d = date(2005, 7, 14)790>>> t = time(12, 30)791>>> datetime.combine(d, t)792datetime.datetime(2005, 7, 14, 12, 30)793>>> # Использование datetime.now() или datetime.utcnow()794>>> datetime.now() 795datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1796>>> datetime.utcnow() 797datetime.datetime(2007, 12, 6, 15, 29, 43, 79060)798>>> # Использование datetime.strptime()799>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")800>>> dt801datetime.datetime(2006, 11, 21, 16, 30)802>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов803>>> tt = dt.timetuple()804>>> for it in tt: 805... print(it)806...8072006 # year80811 # month80921 # day81016 # hour81130 # minute8120 # second8131 # weekday (0 = Monday)814325 # number of days since 1st January815-1 # dst - method tzinfo.dst() returned None816>>> # Дата в формате ISO817>>> ic = dt.isocalendar()818>>> for it in ic: 819... print(it)820...8212006 # ISO year82247 # ISO week8232 # ISO weekday824>>> # Форматирование datetime825>>> dt.strftime("%A, %d. %B %Y %I:%M%p")826'Tuesday, 21. November 2006 04:30PM'827>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")828'The day is 21, the month is November, the time is 04:30PM.'829```830831Использование datetime с tzinfo:832833```python834>>> from datetime import timedelta, datetime, tzinfo, timezone835>>> class KabulTz(tzinfo):836... # В Кабуле до 1945 года использовали +4, затем перешли на +4:30837... UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)838... def utcoffset(self, dt):839... if dt.year < 1945:840... return timedelta(hours=4)841... elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30):842... # Если dt попадает в мнимый диапазон, используйте fold для определения способа843... # для разрешения. См. PEP495844... return timedelta(hours=4, minutes=(30 if dt.fold else 0))845... else:846... return timedelta(hours=4, minutes=30)847...848... def fromutc(self, dt):849... # Для fromutc требуется собственная реализация, так как850... # входные данные для этой функции – это datetime со значениями UTC851... # но с tzinfo, установленным в self852... # См. datetime.astimezone или fromtimestamp853...854... # Следуйте тем же проверкам, что и в datetime.tzinfo855... if not isinstance(dt, datetime):856... raise TypeError("fromutc() requires a datetime argument")857... if dt.tzinfo is not self:858... raise ValueError("dt.tzinfo is not self")859...860... if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:861... return dt + timedelta(hours=4, minutes=30)862... else:863... return dt + timedelta(hours=4)864...865... def dst(self, dt):866... return timedelta(0)867...868... def tzname(self, dt):869... if dt >= self.UTC_MOVE_DATE:870... return "+04:30"871... else:872... return "+04"873...874... def __repr__(self):875... return f"{self.__class__.__name__}()"876...877>>> tz1 = KabulTz()878>>> # Datetime до изменения879>>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1)880>>> print(dt1.utcoffset())8814:00:00882>>> # Datetime после изменения883>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1)884>>> print(dt2.utcoffset())8854:30:00886>>> # Преобразовать datetime в другой часовой пояс887>>> dt3 = dt2.astimezone(timezone.utc)888>>> dt3889datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)890>>> dt2891datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())892>>> dt2.utctimetuple() == dt3.utctimetuple()893True894```895896## [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) Объекты897898Объект time представляет (локальное) время суток, независимо от конкретного дня, и может корректироваться с помощью объекта [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo).899900#### `class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)`901902Все аргументы необязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo). Остальные аргументы должны быть целыми числами в следующих диапазонах:903904- `0 <= hour < 24`,905- `0 <= minute < 60`,906- `0 <= second < 60`,907- `0 <= microsecond < 1000000`,908- `fold in [0, 1]`.909910Если указан аргумент вне этих диапазонов, вызывается [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError). Все по умолчанию равны `0`, кроме *tzinfo*, который по умолчанию равен [`None`](https://python-all.ru/3.7/library/constants.html#None).911912Атрибуты класса:913914#### `time.min`915916Самое раннее представимое [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time), `time(0, 0, 0, 0)`.917918#### `time.max`919920Самое позднее представимое [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time), `time(23, 59, 59, 999999)`.921922#### `time.resolution`923924Наименьшая возможная разница между неравными объектами [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time), `timedelta(microseconds=1)`, хотя следует отметить, что арифметические операции над объектами [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) не поддерживаются.925926Атрибуты экземпляра (только для чтения):927928#### `time.hour`929930В `range(24)`.931932#### `time.minute`933934В `range(60)`.935936#### `time.second`937938В `range(60)`.939940#### `time.microsecond`941942В `range(1000000)`.943944#### `time.tzinfo`945946Объект, переданный как аргумент tzinfo конструктору [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time), или `None`, если ничего не было передано.947948#### `time.fold`949950В `[0, 1]`. Используется для устранения неоднозначности локального времени во время повторного интервала. (Повторный интервал возникает, когда часы переводятся назад в конце перехода на летнее время или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значение 0 (1) представляет более ранний (поздний) из двух моментов с одинаковым локальным временем.951952Новое в версии 3.6.953954Поддерживаемые операции:955956- сравнение [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) с [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time), где *a* считается меньше *b*, когда *a* предшествует *b* во времени. Если один сравниваемый объект является naive, а другой aware, вызывается [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError) при попытке упорядочивающего сравнения. При сравнении на равенство наивные экземпляры никогда не равны aware-экземплярам.957958 Если оба сравниваемых объекта являются aware и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo) игнорируется, и сравниваются базовые моменты времени. Если оба сравниваемых объекта являются aware и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo), объекты сначала корректируются путём вычитания их смещений UTC (полученных из `self.utcoffset()`). Чтобы предотвратить переход сравнения объектов разных типов к сравнению по умолчанию по адресу объекта, при сравнении объекта [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) с объектом другого типа вызывается [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. Последние случаи возвращают [`False`](https://python-all.ru/3.7/library/constants.html#False) или [`True`](https://python-all.ru/3.7/library/constants.html#True) соответственно.959960 Изменено в версии 3.3: Сравнения на равенство между наивными и aware экземплярами [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) больше не вызывают [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError).961- хэш, использование в качестве ключа словаря962- эффективная сериализация (pickling)963964В логических контекстах объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) всегда считается истинным.965966Изменено в версии 3.5: До Python 3.5 объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) считался ложным, если он представлял полночь по UTC. Это поведение считалось неочевидным и чреватым ошибками и было удалено в Python 3.5. Подробности см. в [bpo-13936](https://python-all.ru/3.7/library/datetime.html).967968Другой конструктор:969970#### `classmethod time.fromisoformat(time_string)`971972Возвращает [`time`](https://python-all.ru/3.7/library/time.html#module-time), соответствующий *time\_string*, в одном из форматов, которые выдаёт [`time.isoformat()`](https://python-all.ru/3.7/library/datetime.html#datetime.time.isoformat). В частности, эта функция поддерживает строки в формате `HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]`.973974> **Внимание**975>976> Эта функция не предназначена для разбора произвольных строк ISO 8601 – она лишь обратная операция к [`time.isoformat()`](https://python-all.ru/3.7/library/datetime.html#datetime.time.isoformat).977978Добавлено в версии 3.7.979980Методы экземпляра:981982#### `time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0)`983984Возвращает [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) с теми же значениями, за исключением атрибутов, которым заданы новые значения указанными именованными аргументами. Обратите внимание, что `tzinfo=None` можно указать, чтобы создать наивный [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) из осознанного [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) без преобразования данных о времени.985986Новое в версии 3.6: Добавлен аргумент `fold`.987988#### `time.isoformat(timespec='auto')`989990Возвращает строку, представляющую время в формате ISO 8601: HH:MM:SS.ffffff или, если [`microsecond`](https://python-all.ru/3.7/library/datetime.html#datetime.time.microsecond) равно 0, HH:MM:SS. Если [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.time.utcoffset) не возвращает `None`, добавляется строка с UTC-смещением: HH:MM:SS.ffffff+HH:MM\[:SS\[.ffffff\]\] или, если self.microsecond равно 0, HH:MM:SS+HH:MM\[:SS\[.ffffff\]\].991992Необязательный аргумент *timespec* указывает количество дополнительных компонентов времени, которые нужно включить (по умолчанию `'auto'`). Он может быть одним из следующих:993994- `'auto'`: То же, что и `'seconds'`, если [`microsecond`](https://python-all.ru/3.7/library/datetime.html#datetime.time.microsecond) равно 0, иначе то же, что и `'microseconds'`.995- `'hours'`: включает [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.time.hour) в двузначный формат HH.996- `'minutes'`: включает [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.time.hour) и [`minute`](https://python-all.ru/3.7/library/datetime.html#datetime.time.minute) в формат HH:MM.997- `'seconds'`: включает [`hour`](https://python-all.ru/3.7/library/datetime.html#datetime.time.hour), [`minute`](https://python-all.ru/3.7/library/datetime.html#datetime.time.minute) и [`second`](https://python-all.ru/3.7/library/datetime.html#datetime.time.second) в формат HH:MM:SS.998- `'milliseconds'`: включает полное время, но усекает дробную часть секунд до миллисекунд. Формат HH:MM:SS.sss.999- `'microseconds'`: включает полное время в формате HH:MM:SS.ffffff.10001001> **Примечание**1002>1003> Исключённые компоненты времени усекаются, а не округляются.10041005[`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) будет вызвано при недопустимом аргументе *timespec*.10061007```python1008>>> from datetime import time1009>>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')1010'12:34'1011>>> dt = time(hour=12, minute=34, second=56, microsecond=0)1012>>> dt.isoformat(timespec='microseconds')1013'12:34:56.000000'1014>>> dt.isoformat(timespec='auto')1015'12:34:56'1016```10171018Новое в версии 3.6: Добавлен аргумент *timespec*.10191020#### `time.__str__()`10211022Для времени *t*, `str(t)` эквивалентно `t.isoformat()`.10231024#### `time.strftime(format)`10251026Возвращает строку, представляющую время, управляемую явной строкой формата. Полный список директив форматирования см. в [strftime() and strptime() Behavior](https://python-all.ru/3.7/library/datetime.html#strftime-strptime-behavior).10271028#### `time.__format__(format)`10291030То же, что и [`time.strftime()`](https://python-all.ru/3.7/library/datetime.html#datetime.time.strftime). Это позволяет задавать строку формата для объекта [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) в [форматированных строковых литералах](https://python-all.ru/3.7/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.7/library/stdtypes.html#str.format). Полный список директив форматирования см. в [strftime() and strptime() Behavior](https://python-all.ru/3.7/library/datetime.html#strftime-strptime-behavior).10311032#### `time.utcoffset()`10331034Если [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(None)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) с величиной менее одного дня.10351036Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.10371038#### `time.dst()`10391040Если [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.dst(None)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) с величиной менее одного дня.10411042Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.10431044#### `time.tzname()`10451046Если [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.tzname(None)`, или возбуждает исключение, если последнее не возвращает `None` или строковый объект.10471048Пример:10491050```python1051>>> from datetime import time, tzinfo, timedelta1052>>> class TZ1(tzinfo):1053... def utcoffset(self, dt):1054... return timedelta(hours=1)1055... def dst(self, dt):1056... return timedelta(0)1057... def tzname(self,dt):1058... return "+01:00"1059... def __repr__(self):1060... return f"{self.__class__.__name__}()"1061...1062>>> t = time(12, 10, 30, tzinfo=TZ1())1063>>> t1064datetime.time(12, 10, 30, tzinfo=TZ1())1065>>> t.isoformat()1066'12:10:30+01:00'1067>>> t.dst()1068datetime.timedelta(0)1069>>> t.tzname()1070'+01:00'1071>>> t.strftime("%H:%M:%S %Z")1072'12:10:30 +01:00'1073>>> 'The {} is {:%H:%M}.'.format("time", t)1074'The time is 12:10.'1075```10761077## [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) Объекты10781079#### `class datetime.tzinfo`10801081Это абстрактный базовый класс, то есть его не следует инстанцировать напрямую. Необходимо создать конкретный подкласс и (как минимум) реализовать стандартные методы [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), необходимые для используемых методов [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). Модуль [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) предоставляет простой конкретный подкласс [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) – [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone), который может представлять часовые пояса с фиксированным смещением от UTC, такие как сам UTC или североамериканские EST и EDT.10821083Экземпляр (конкретного подкласса) [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) можно передать конструкторам объектов [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time). Последние рассматривают свои атрибуты как местное время, а объект [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) поддерживает методы, показывающие смещение местного времени от UTC, название часового пояса и смещение DST – все относительно переданного им объекта даты или времени.10841085Особое требование для сериализации (pickling): подкласс [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) должен иметь метод [`__init__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__init__), который можно вызывать без аргументов; иначе объект можно сериализовать, но, возможно, нельзя будет десериализовать. Это техническое требование, которое в будущем может быть смягчено.10861087Конкретному подклассу [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) может потребоваться реализовать следующие методы. Какие именно методы нужны, зависит от того, как используются осознанные объекты [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime). Если есть сомнения, просто реализуйте их все.10881089#### `tzinfo.utcoffset(dt)`10901091Возвращает смещение местного времени от UTC в виде объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), положительного к востоку от UTC. Если местное время западнее UTC, смещение должно быть отрицательным. Обратите внимание: предполагается, что это полное смещение от UTC; например, если объект [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) представляет как часовой пояс, так и поправку на летнее время, [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.utcoffset) должна вернуть их сумму. Если UTC-смещение неизвестно, верните `None`. В противном случае возвращаемое значение должно быть объектом [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), строго между `-timedelta(hours=24)` и `timedelta(hours=24)` (величина смещения должна быть меньше суток). Большинство реализаций [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.utcoffset), вероятно, будут выглядеть как один из этих двух вариантов:10921093```python1094return CONSTANT # класс с фиксированным смещением1095return CONSTANT + self.dst(dt) # класс, учитывающий летнее время1096```10971098Если [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.utcoffset) не возвращает `None`, то [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.dst) также не должен возвращать `None`.10991100Реализация по умолчанию [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.utcoffset) возбуждает [`NotImplementedError`](https://python-all.ru/3.7/library/exceptions.html#NotImplementedError).11011102Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.11031104#### `tzinfo.dst(dt)`11051106Возвращает поправку на летнее время (DST) в виде объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) или `None`, если информация о DST неизвестна. Верните `timedelta(0)`, если DST не действует. Если DST действует, верните смещение в виде объекта [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta) (подробнее см. [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.utcoffset)). Обратите внимание: смещение DST, если применимо, уже добавлено к UTC-смещению, возвращаемому [`utcoffset()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.utcoffset), поэтому нет необходимости обращаться к [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.dst), если вы не хотите получить информацию о DST отдельно. Например, [`datetime.timetuple()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.timetuple) вызывает метод [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.dst) своего атрибута [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzinfo), чтобы определить, как должен быть установлен флаг `tm_isdst`, а [`tzinfo.fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc) вызывает [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.dst) для учёта изменений DST при пересечении часовых поясов.11071108Экземпляр *tz* подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), который моделирует как стандартное, так и летнее время, должен быть согласован в следующем смысле:11091110`tz.utcoffset(dt) - tz.dst(dt)`11111112должен возвращать один и тот же результат для каждого [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) *dt* с `dt.tzinfo == tz`. Для разумных подклассов [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) это выражение даёт «стандартное смещение» часового пояса, которое не должно зависеть от даты или времени, а только от географического положения. Реализация [`datetime.astimezone()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.astimezone) полагается на это, но не может обнаружить нарушения; это ответственность программиста – гарантировать это. Если подкласс [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) не может этого гарантировать, он может переопределить реализацию по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc), чтобы она корректно работала с `astimezone()`.11131114Большинство реализаций [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.dst), вероятно, будут выглядеть как один из этих двух вариантов:11151116```python1117def dst(self, dt):1118 # класс с фиксированным смещением: не учитывает летнее время1119 return timedelta(0)1120```11211122или11231124```python1125def dst(self, dt):1126 # Код для установки dston и dstoff в значения летнего времени часового пояса1127 # переходные моменты времени на основе входного dt.year и выраженные1128 # в стандартном местном времени. Затем11291130 if dston <= dt.replace(tzinfo=None) < dstoff:1131 return timedelta(hours=1)1132 else:1133 return timedelta(0)1134```11351136Реализация по умолчанию [`dst()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.dst) вызывает исключение [`NotImplementedError`](https://python-all.ru/3.7/library/exceptions.html#NotImplementedError).11371138Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.11391140#### `tzinfo.tzname(dt)`11411142Возвращает название часового пояса, соответствующее объекту [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) *dt*, в виде строки. Модуль [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) ничего не определяет относительно строковых названий, и нет требования, чтобы они значили что-то конкретное. Например, «GMT», «UTC», «-500», «-5:00», «EDT», «US/Eastern», «America/New York» – все это допустимые ответы. Верните `None`, если строковое название неизвестно. Обратите внимание, что это метод, а не фиксированная строка, в первую очередь потому, что некоторые подклассы [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) могут захотеть возвращать разные названия в зависимости от конкретного значения *dt*, особенно если класс [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) учитывает летнее время.11431144Реализация по умолчанию [`tzname()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.tzname) вызывает исключение [`NotImplementedError`](https://python-all.ru/3.7/library/exceptions.html#NotImplementedError).11451146Эти методы вызываются объектом [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) или [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) в ответ на их одноимённые методы. Объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) передаёт себя в качестве аргумента, а объект [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) передаёт `None`. Поэтому методы подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) должны быть готовы принять аргумент *dt* типа `None` или класса [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime).11471148Когда передаётся `None`, разработчик класса решает, какой ответ будет наилучшим. Например, возврат `None` уместен, если класс хочет указать, что объекты времени не участвуют в протоколах [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo). Возможно, более полезным будет для `utcoffset(None)` вернуть стандартное UTC-смещение, поскольку другого способа узнать стандартное смещение нет.11491150Когда объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) передаётся в ответ на метод [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), `dt.tzinfo` – это тот же объект, что и *self*. Методы [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) могут на это полагаться, если только пользовательский код не вызывает методы [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) напрямую. Предполагается, что методы [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) интерпретируют *dt* как местное время и не должны беспокоиться об объектах в других часовых поясах.11511152Существует ещё один метод [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), который подкласс может переопределить:11531154#### `tzinfo.fromutc(dt)`11551156Это вызывается из реализации по умолчанию [`datetime.astimezone()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.astimezone). При вызове оттуда `dt.tzinfo` – это *self*, а данные даты и времени *dt* следует рассматривать как выражающие время UTC. Цель [`fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc) – скорректировать данные даты и времени, вернув эквивалентный datetime в местном времени *self*.11571158Большинство подклассов [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) должны без проблем наследовать реализацию по умолчанию [`fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc). Она достаточно мощная, чтобы обрабатывать часовые пояса с фиксированным смещением, а также пояса, учитывающие как стандартное, так и летнее время, причём последнее – даже если время перехода на летнее время различается в разные годы. Пример часового пояса, который реализация по умолчанию [`fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc) может не всегда корректно обрабатывать, – это пояс, где стандартное смещение (от UTC) зависит от конкретной даты и времени, что может происходить по политическим причинам. Реализации по умолчанию `astimezone()` и [`fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc) могут не дать желаемого результата, если результат приходится на часы, охватывающие момент изменения стандартного смещения.11591160Опуская код для обработки ошибок, реализация по умолчанию [`fromutc()`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo.fromutc) работает следующим образом:11611162```python1163def fromutc(self, dt):1164 # вызывает ошибку ValueError, если dt.tzinfo не равен self1165 dtoff = dt.utcoffset()1166 dtdst = dt.dst()1167 # вызывает ValueError, если dtoff или dtdst равны None1168 delta = dtoff - dtdst # это стандартное смещение self1169 if delta:1170 dt += delta # преобразовать в стандартное местное время1171 dtdst = dt.dst()1172 # вызывает ValueError, если dtdst равен None1173 if dtdst:1174 return dt + dtdst1175 else:1176 return dt1177```11781179В следующем файле [`tzinfo_examples.py`](https://python-all.ru/3.7/_downloads/6b45dc135219d1404be49d606589a11d/tzinfo_examples.py) приведены некоторые примеры классов [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo):11801181```python1182from datetime import tzinfo, timedelta, datetime11831184ZERO = timedelta(0)1185HOUR = timedelta(hours=1)1186SECOND = timedelta(seconds=1)11871188# Класс, отражающий представление платформы о местном времени.1189# (Может приводить к неверным значениям для исторических моментов в1190# часовых поясах, где UTC-смещение и/или правила летнего времени1191# менялись в прошлом.)1192import time as _time11931194STDOFFSET = timedelta(seconds = -_time.timezone)1195if _time.daylight:1196 DSTOFFSET = timedelta(seconds = -_time.altzone)1197else:1198 DSTOFFSET = STDOFFSET11991200DSTDIFF = DSTOFFSET - STDOFFSET12011202class LocalTimezone(tzinfo):12031204 def fromutc(self, dt):1205 assert dt.tzinfo is self1206 stamp = (dt - datetime(1970, 1, 1, tzinfo=self)) // SECOND1207 args = _time.localtime(stamp)[:6]1208 dst_diff = DSTDIFF // SECOND1209 # Обнаружение fold1210 fold = (args == _time.localtime(stamp - dst_diff))1211 return datetime(*args, microsecond=dt.microsecond,1212 tzinfo=self, fold=fold)12131214 def utcoffset(self, dt):1215 if self._isdst(dt):1216 return DSTOFFSET1217 else:1218 return STDOFFSET12191220 def dst(self, dt):1221 if self._isdst(dt):1222 return DSTDIFF1223 else:1224 return ZERO12251226 def tzname(self, dt):1227 return _time.tzname[self._isdst(dt)]12281229 def _isdst(self, dt):1230 tt = (dt.year, dt.month, dt.day,1231 dt.hour, dt.minute, dt.second,1232 dt.weekday(), 0, 0)1233 stamp = _time.mktime(tt)1234 tt = _time.localtime(stamp)1235 return tt.tm_isdst > 012361237Local = LocalTimezone()12381239# Полная реализация текущих правил летнего времени для основных часовых поясов США.12401241def first_sunday_on_or_after(dt):1242 days_to_go = 6 - dt.weekday()1243 if days_to_go:1244 dt += timedelta(days_to_go)1245 return dt12461247# Правила летнего времени в США1248#1249# Это упрощённый набор правил для США (т.е. неверный для некоторых случаев)1250# времени начала и окончания летнего времени. Полный и актуальный набор правил летнего времени1251# и определений часовых поясов смотрите в базе данных Olson (или попробуйте pytz):1252# http://www.twinsun.com/tz/tz-link.htm1253# http://sourceforge.net/projects/pytz/ (возможно, неактуально)1254#1255# В США с 2007 года летнее время начинается в 2 часа ночи (стандартное время) во второе1256# воскресенье марта, то есть первое воскресенье 8 марта или после него.1257DSTSTART_2007 = datetime(1, 3, 8, 2)1258# и заканчивается в 2 часа ночи (летнее время) в первое воскресенье ноября.1259DSTEND_2007 = datetime(1, 11, 1, 2)1260# С 1987 по 2006 год летнее время начиналось в 2 часа ночи (стандартное время) в первое1261# воскресенье апреля и заканчивалось в 2 часа ночи (летнее время) в последнее1262# воскресенье октября, то есть первое воскресенье 25 октября или после него.1263DSTSTART_1987_2006 = datetime(1, 4, 1, 2)1264DSTEND_1987_2006 = datetime(1, 10, 25, 2)1265# С 1967 по 1986 год летнее время начиналось в 2 часа ночи (стандартное время) в последнее1266# воскресенье апреля (то есть 24 апреля или после него) и заканчивалось в 2 часа ночи (летнее время)1267# в последнее воскресенье октября, которое является первым воскресеньем1268# 25 октября или позднее.1269DSTSTART_1967_1986 = datetime(1, 4, 24, 2)1270DSTEND_1967_1986 = DSTEND_1987_200612711272def us_dst_range(year):1273 # Найти время начала и окончания перехода на летнее время в США. Для лет до 1967 года вернуть1274 # start = end, если летнее время не применяется.1275 if 2006 < year:1276 dststart, dstend = DSTSTART_2007, DSTEND_20071277 elif 1986 < year < 2007:1278 dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_20061279 elif 1966 < year < 1987:1280 dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_19861281 else:1282 return (datetime(year, 1, 1), ) * 212831284 start = first_sunday_on_or_after(dststart.replace(year=year))1285 end = first_sunday_on_or_after(dstend.replace(year=year))1286 return start, end12871288class USTimeZone(tzinfo):12891290 def __init__(self, hours, reprname, stdname, dstname):1291 self.stdoffset = timedelta(hours=hours)1292 self.reprname = reprname1293 self.stdname = stdname1294 self.dstname = dstname12951296 def __repr__(self):1297 return self.reprname12981299 def tzname(self, dt):1300 if self.dst(dt):1301 return self.dstname1302 else:1303 return self.stdname13041305 def utcoffset(self, dt):1306 return self.stdoffset + self.dst(dt)13071308 def dst(self, dt):1309 if dt is None or dt.tzinfo is None:1310 # В одном или обоих случаях здесь может быть уместно исключение.1311 # Это зависит от того, как вы хотите их обрабатывать. Реализация по умолчанию1312 # fromutc() (вызываемая реализацией astimezone() по умолчанию)1313 # реализация) передаёт datetime с dt.tzinfo равным self.1314 return ZERO1315 assert dt.tzinfo is self1316 start, end = us_dst_range(dt.year)1317 # Нельзя сравнивать наивные и осведомлённые объекты, поэтому сначала удалите часовой пояс из1318 # сначала dt.1319 dt = dt.replace(tzinfo=None)1320 if start + HOUR <= dt < end - HOUR:1321 # Действует летнее время.1322 return HOUR1323 if end - HOUR <= dt < end:1324 # Сложить (неоднозначный час): используйте dt.fold для разрешения неоднозначности.1325 return ZERO if dt.fold else HOUR1326 if start <= dt < start + HOUR:1327 # Gap (несуществующий час): примените обратное правило fold.1328 return HOUR if dt.fold else ZERO1329 # Летнее время не действует.1330 return ZERO13311332 def fromutc(self, dt):1333 assert dt.tzinfo is self1334 start, end = us_dst_range(dt.year)1335 start = start.replace(tzinfo=self)1336 end = end.replace(tzinfo=self)1337 std_time = dt + self.stdoffset1338 dst_time = std_time + HOUR1339 if end <= dst_time < end + HOUR:1340 # Повторяющийся час1341 return std_time.replace(fold=1)1342 if std_time < start or dst_time >= end:1343 # Стандартное время1344 return std_time1345 if start <= std_time < end - HOUR:1346 # Летнее время1347 return dst_time13481349Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")1350Central = USTimeZone(-6, "Central", "CST", "CDT")1351Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")1352Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")1353```13541355Обратите внимание, что дважды в год в подклассе [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), учитывающем как стандартное, так и летнее время, в точках перехода на летнее время возникают неизбежные тонкости. Для конкретики рассмотрим US Eastern (UTC -0500), где EDT начинается через минуту после 1:59 (EST) во второе воскресенье марта и заканчивается через минуту после 1:59 (EDT) в первое воскресенье ноября:13561357```python1358 UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM1359 EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM1360 EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM13611362start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM13631364 end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM1365```13661367Когда начинается DST (строка «start»), местные настенные часы перескакивают с 1:59 на 3:00. Местное время вида 2:MM в этот день не имеет смысла, поэтому `astimezone(Eastern)` не вернёт результат с `hour == 2` в день начала DST. Например, при весеннем переходе 2016 года мы получаем13681369```python1370>>> from datetime import datetime, timezone1371>>> from tzinfo_examples import HOUR, Eastern1372>>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc)1373>>> for i in range(4):1374... u = u0 + i*HOUR1375... t = u.astimezone(Eastern)1376... print(u.time(), 'UTC =', t.time(), t.tzname())1377...137805:00:00 UTC = 00:00:00 EST137906:00:00 UTC = 01:00:00 EST138007:00:00 UTC = 03:00:00 EDT138108:00:00 UTC = 04:00:00 EDT1382```13831384Когда DST заканчивается (строка «end»), возникает потенциально более серьёзная проблема: существует час, который нельзя однозначно записать в местном поясном времени: последний час летнего времени. В часовом поясе Eastern это моменты вида 5:MM UTC в день окончания летнего времени. Местные часы перескакивают с 1:59 (летнее время) обратно на 1:00 (стандартное время). Местные времена вида 1:MM неоднозначны. `astimezone()` имитирует поведение местных часов, отображая два соседних часа UTC в один и тот же местный час. В примере Eastern времена UTC вида 5:MM и 6:MM оба отображаются в 1:MM при преобразовании в Eastern, но более ранние времена имеют атрибут [`fold`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fold), установленный в 0, а более поздние – в 1. Например, при переходе на зимнее время в 2016 году мы получаем13851386```python1387>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)1388>>> for i in range(4):1389... u = u0 + i*HOUR1390... t = u.astimezone(Eastern)1391... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)1392...139304:00:00 UTC = 00:00:00 EDT 0139405:00:00 UTC = 01:00:00 EDT 0139506:00:00 UTC = 01:00:00 EST 1139607:00:00 UTC = 02:00:00 EST 01397```13981399Обратите внимание, что экземпляры [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime), отличающиеся только значением атрибута [`fold`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fold), считаются равными при сравнении.14001401Приложения, которые не могут мириться с неоднозначностью местного времени, должны явно проверять значение атрибута [`fold`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.fold) или избегать использования гибридных подклассов [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo); неоднозначности отсутствуют при использовании [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone) или любого другого подкласса [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo) с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).14021403> **См. также**1404>1405> **[dateutil.tz](https://python-all.ru/3.7/library/datetime.html)**1406>1407> Стандартная библиотека содержит класс [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone) для обработки произвольных фиксированных смещений от UTC и [`timezone.utc`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone.utc) в качестве экземпляра часового пояса UTC.1408>1409> Библиотека *dateutil.tz* предоставляет *базу данных часовых поясов IANA* (также известную как база данных Olson) в Python, и её использование рекомендуется.1410>1411> **[база данных часовых поясов IANA](https://python-all.ru/3.7/library/datetime.html)**1412>1413> База данных часовых поясов (часто называемая tz, tzdata или zoneinfo) содержит код и данные, представляющие историю местного времени для многих представительных мест по всему миру. Она периодически обновляется, чтобы отражать изменения, вносимые политическими органами в границы часовых поясов, смещения UTC и правила перехода на летнее время.14141415## [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone) Объекты14161417Класс [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone) является подклассом [`tzinfo`](https://python-all.ru/3.7/library/datetime.html#datetime.tzinfo), каждый экземпляр которого представляет часовой пояс, заданный фиксированным смещением от UTC. Обратите внимание, что объекты этого класса нельзя использовать для представления информации о часовом поясе в местах, где в разные дни года используются разные смещения или где были внесены исторические изменения в гражданское время.14181419#### `class datetime.timezone(offset, name=None)`14201421Аргумент *offset* должен быть задан как объект [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), представляющий разницу между местным временем и UTC. Он должен быть строго между `-timedelta(hours=24)` и `timedelta(hours=24)`, иначе возникает [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError).14221423Аргумент *name* необязателен. Если он задан, то должен быть строкой, которая будет использоваться как значение, возвращаемое методом [`datetime.tzname()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.tzname).14241425Новое в версии 3.2.14261427Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.14281429#### `timezone.utcoffset(dt)`14301431Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone). Аргумент *dt* игнорируется. Возвращаемое значение – экземпляр [`timedelta`](https://python-all.ru/3.7/library/datetime.html#datetime.timedelta), равный разнице между местным временем и UTC.14321433Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.14341435#### `timezone.tzname(dt)`14361437Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone). Если *name* не указан в конструкторе, имя, возвращаемое `tzname(dt)`, генерируется из значения `offset` следующим образом. Если *offset* равен `timedelta(0)`, именем является «UTC», в противном случае это строка «UTC±HH:MM», где ± – знак `offset`, HH и MM – двузначные числа `offset.hours` и `offset.minutes` соответственно.14381439Изменено в версии 3.6: Имя, генерируемое из `offset=timedelta(0)`, теперь просто «UTC», а не «UTC+00:00».14401441#### `timezone.dst(dt)`14421443Всегда возвращает `None`.14441445#### `timezone.fromutc(dt)`14461447Возвращает `dt + offset`. Аргумент *dt* должен быть осведомлённым (aware) экземпляром [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime), с `tzinfo`, установленным в `self`.14481449Атрибуты класса:14501451#### `timezone.utc`14521453Часовой пояс UTC, `timezone(timedelta(0))`.14541455## `strftime()` и `strptime()` Поведение14561457Объекты [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) поддерживают метод `strftime(format)`, который создаёт строку, представляющую время, под управлением явной форматной строки. В общем, `d.strftime(fmt)` действует как `time.strftime(fmt, d.timetuple())` модуля [`time`](https://python-all.ru/3.7/library/time.html#module-time), хотя не все объекты поддерживают метод `timetuple()`.14581459И наоборот, метод класса [`datetime.strptime()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.strptime) создаёт объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime) из строки, представляющей дату и время, и соответствующей форматной строки. `datetime.strptime(date_string, format)` эквивалентен `datetime(*(time.strptime(date_string, format)[0:6]))`, за исключением случаев, когда формат включает субсекундные компоненты или информацию о смещении часового пояса, которые поддерживаются в `datetime.strptime`, но отбрасываются `time.strptime`.14601461Для объектов [`time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) не следует использовать коды формата для года, месяца и дня, поскольку объекты time не имеют таких значений. Если они всё же используются, то `1900` подставляется для года, а `1` – для месяца и дня.14621463Для объектов [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) не следует использовать коды формата для часов, минут, секунд и микросекунд, поскольку объекты [`date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) не имеют таких значений. Если они всё же используются, то `0` подставляется для них.14641465Для метода класса [`datetime.strptime()`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime.strptime) значением по умолчанию является `1900-01-01T00:00:00.000`: любые компоненты, не указанные в форматной строке, будут взяты из значения по умолчанию. [2](https://python-all.ru/3.7/library/datetime.html#id4)14661467Полный набор поддерживаемых кодов формата различается на разных платформах, поскольку Python вызывает функцию `strftime()` из C-библиотеки платформы, и различия между платформами обычны. Чтобы просмотреть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации *strftime(3)*.14681469По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются в выходных данных без изменений, в то время как на других `strftime` может вызвать [`UnicodeError`](https://python-all.ru/3.7/library/exceptions.html#UnicodeError) или вернуть пустую строку.14701471Ниже приведён список всех кодов формата, которые требуются стандартом C (версии 1989 года), и они работают на всех платформах со стандартной реализацией C. Обратите внимание, что версия 1999 года стандарта C добавила дополнительные коды формата.14721473| Директива | Значение | Пример | Примечания |1474| --- | --- | --- | --- |1475| `%a` | День недели как сокращённое название в локали. | Вс, Пн, …, Сб (en\_US); So, Mo, …, Sa (de\_DE) | (1) |1476| `%A` | Название дня недели в полной форме, зависящее от локали. | Воскресенье, Понедельник, …, Суббота (en\_US); Sonntag, Montag, …, Samstag (de\_DE) | (1) |1477| `%w` | День недели в виде десятичного числа, где 0 – воскресенье, а 6 – суббота. | 0, 1, …, 6 | |1478| `%d` | День месяца в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 31 | (9) |1479| `%b` | Название месяца в сокращённой форме, зависящей от локали. | Янв, Фев, …, Дек (en\_US); Jan, Feb, …, Dez (de\_DE) | (1) |1480| `%B` | Название месяца в полной форме, зависящей от локали. | Январь, Февраль, …, Декабрь (en\_US); Januar, Februar, …, Dezember (de\_DE) | (1) |1481| `%m` | Месяц в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 | (9) |1482| `%y` | Год без столетия в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 99 | (9) |1483| `%Y` | Год со столетием в виде десятичного числа. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |1484| `%H` | Часы (в 24-часовом формате) в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 23 | (9) |1485| `%I` | Часы (в 12-часовом формате) в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 | (9) |1486| `%p` | Эквивалент AM или PM, зависящий от локали. | AM, PM (en\_US); am, pm (de\_DE) | (1), (3) |1487| `%M` | Минуты в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 | (9) |1488| `%S` | Секунды в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 | (4), (9) |1489| `%f` | Микросекунда в виде десятичного числа, дополненного слева нулями. | 000000, 000001, …, 999999 | (5) |1490| `%z` | Смещение UTC в формате ±HHMM\[SS\[.ffffff\]\] (пустая строка, если объект является наивным). | (пусто), +0000, -0400, +1030, +063415, -030712.345216 | (6) |1491| `%Z` | Название часового пояса (пустая строка, если объект наивный). | (empty), UTC, EST, CST | |1492| `%j` | День года в виде десятичного числа, дополненного слева нулями. | 001, 002, …, 366 | (9) |1493| `%U` | Номер недели в году (воскресенье – первый день недели) в виде десятичного числа, дополненного нулями слева. Все дни нового года, предшествующие первому воскресенью, считаются неделей 0. | 00, 01, …, 53 | (7), (9) |1494| `%W` | Номер недели в году (понедельник – первый день недели) в виде десятичного числа. Все дни нового года, предшествующие первому понедельнику, считаются неделей 0. | 00, 01, …, 53 | (7), (9) |1495| `%c` | Представление даты и времени, подходящее для локали. | Вт Авг 16 21:30:00 1988 (en\_US); Di 16 Aug 21:30:00 1988 (de\_DE) | (1) |1496| `%x` | Представление даты, соответствующее локали. | 08/16/88 (None); 08/16/1988 (en\_US); 16.08.1988 (de\_DE) | (1) |1497| `%X` | Представление времени, соответствующее локали. | 21:30:00 (en\_US); 21:30:00 (de\_DE) | (1) |1498| `%%` | Литеральный символ `'%'`. | % | |14991500Несколько дополнительных директив, не предусмотренных стандартом C89, включены для удобства. Все эти параметры соответствуют значениям дат ISO 8601. Они могут быть недоступны на всех платформах при использовании с методом `strftime()`. Директивы года и недели по ISO 8601 не взаимозаменяемы с приведенными выше директивами года и номера недели. Вызов `strptime()` с неполными или неоднозначными директивами ISO 8601 приведет к исключению [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError).15011502| Директива | Значение | Пример | Примечания |1503| --- | --- | --- | --- |1504| `%G` | Год по ISO 8601 с веком, представляющий год, который содержит большую часть недели по ISO 8601 (`%V`). | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |1505| `%u` | День недели по ISO 8601 в виде десятичного числа, где 1 – понедельник. | 1, 2, …, 7 | |1506| `%V` | Неделя по ISO 8601 в виде десятичного числа, где понедельник считается первым днём недели. Неделя 01 – это неделя, содержащая 4 января. | 01, 02, …, 53 | (8), (9) |15071508Новое в версии 3.6: `%G`, `%u` и `%V` были добавлены.15091510Примечания:151115121. Поскольку формат зависит от текущей локали, следует проявлять осторожность при выводах о возвращаемом значении. Порядок полей может различаться (например, “месяц/день/год” вместо “день/месяц/год”), а результат может содержать символы Unicode, закодированные с помощью кодировки локали по умолчанию (например, если текущая локаль – `ja_JP`, кодировкой по умолчанию может быть любая из `eucJP`, `SJIS` или `utf-8`; используйте [`locale.getlocale()`](https://python-all.ru/3.7/library/locale.html#locale.getlocale), чтобы определить кодировку текущей локали).15132. Метод `strptime()` может разбирать годы в полном диапазоне \[1, 9999\], но годы \< 1000 должны быть дополнены нулями до 4-значной ширины.15141515 Изменено в версии 3.2: В предыдущих версиях метод `strftime()` был ограничен gодами \>= 1900.15161517 Изменено в версии 3.3: В версии 3.2 метод `strftime()` был ограничен gодами \>= 1000.15183. При использовании с методом `strptime()` директива `%p` влияет только на поле вывода часа, если директива `%I` используется для разбора часа.15194. В отличие от модуля [`time`](https://python-all.ru/3.7/library/time.html#module-time), модуль [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) не поддерживает високосные секунды.15205. При использовании с методом `strptime()` директива `%f` принимает от одной до шести цифр и дополняется нулями справа. `%f` является расширением набора символов формата стандарта C (но реализовано отдельно в объектах datetime, поэтому всегда доступно).15216. Для наивного объекта коды формата `%z` и `%Z` заменяются пустыми строками.15221523 Для осведомлённого объекта:15241525 **`%z`**15261527 `utcoffset()` преобразуется в строку вида ±HHMM\[SS\[.ffffff\]\], где HH – двузначная строка, задающая количество часов смещения UTC, MM – двузначная строка, задающая количество минут смещения UTC, SS – двузначная строка, задающая количество секунд смещения UTC, а ffffff – шестизначная строка, задающая количество микросекунд смещения UTC. Часть ffffff опускается, если смещение равно целому числу секунд; обе части ffffff и SS опускаются, если смещение равно целому числу минут. Например, если `utcoffset()` возвращает `timedelta(hours=-3, minutes=-30)`, то `%z` заменяется строкой `'-0330'`.15281529 Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.15301531 Изменено в версии 3.7: Когда директива `%z` передаётся методу `strptime()`, смещения UTC могут содержать двоеточие в качестве разделителя между часами, минутами и секундами. Например, `'+01:00:00'` будет разобрано как смещение в один час. Кроме того, указание `'Z'` эквивалентно `'+00:00'`.15321533 **`%Z`**15341535 Если `tzname()` возвращает `None`, то `%Z` заменяется пустой строкой. В противном случае `%Z` заменяется возвращаемым значением, которое должно быть строкой.15361537 Изменено в версии 3.2: Когда директива `%z` передается методу `strptime()`, будет создан осведомленный объект [`datetime`](https://python-all.ru/3.7/library/datetime.html#datetime.datetime). Атрибут `tzinfo` результата будет установлен в экземпляр [`timezone`](https://python-all.ru/3.7/library/datetime.html#datetime.timezone).15387. При использовании с методом `strptime()` `%U` и `%W` используются только в вычислениях, когда указаны день недели и календарный год (`%Y`).15398. Аналогично `%U` и `%W`, `%V` используется только в вычислениях, когда день недели и год по ISO (`%G`) указаны в строке форматирования `strptime()`. Также обратите внимание, что `%G` и `%Y` не являются взаимозаменяемыми.15409. При использовании с методом `strptime()` ведущий ноль является необязательным для форматов `%d`, `%m`, `%H`, `%I`, `%M`, `%S`, `%J`, `%U`, `%W` и `%V`. Формат `%y` требует ведущего нуля.15411542Сноски15431544**[1](https://python-all.ru/3.7/library/datetime.html#id1)**15451546Если, конечно, не учитывать эффекты теории относительности15471548**[2](https://python-all.ru/3.7/library/datetime.html#id2)**15491550Передача `datetime.strptime('Feb 29', '%b %d')` завершится ошибкой, поскольку `1900` не является високосным годом.1551