Документация Python неофициальный перевод

datetime.md

1926 строк · 165.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.9/library/datetime.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) – Основные типы даты и времени89**Исходный код:** [Lib/datetime.py](https://python-all.ru/src/3.9/Lib/datetime.py)1011---1213Модуль [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) предоставляет классы для работы с датами и временем.1415Хотя арифметика дат и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования и обработки вывода.1617> **См. также**18>19> **Модуль [`calendar`](https://python-all.ru/3.9/library/calendar.html#module-calendar)**20>21> Общие функции, связанные с календарём.22>23> **Модуль [`time`](https://python-all.ru/3.9/library/time.html#module-time)**24>25> Доступ к времени и преобразования.26>27> **Модуль [`zoneinfo`](https://python-all.ru/3.9/library/zoneinfo.html#module-zoneinfo)**28>29> Конкретные часовые пояса, представляющие базу данных часовых поясов IANA.30>31> **Пакет [dateutil](https://python-all.ru/3.9/library/datetime.html)**32>33> Сторонняя библиотека с расширенной поддержкой часовых поясов и разбора.3435## Осведомлённые и наивные объекты3637Объекты даты и времени могут быть «осведомлёнными» (aware) или «наивными» (naive) в зависимости от того, содержат ли они информацию о часовом поясе.3839При достаточном знании применимых алгоритмических и политических поправок времени, таких как информация о часовом поясе и переходе на летнее время, **осведомлённый** объект может определить своё положение относительно других осведомлённых объектов. Осведомлённый объект представляет конкретный момент времени, не допускающий неоднозначного толкования. [1](https://python-all.ru/3.9/library/datetime.html#id5)4041**Наивный** объект не содержит достаточно информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Относится ли наивный объект к всемирному координированному времени (UTC), местному времени или времени в каком-либо другом часовом поясе – решает программа, точно так же, как программа решает, обозначает ли конкретное число метры, мили или массу. Наивные объекты легко понять и с ними легко работать, но ценой игнорирования некоторых аспектов реальности.4243Для приложений, требующих осведомлённых объектов, объекты [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) имеют необязательный атрибут информации о часовом поясе `tzinfo`, который может быть установлен в экземпляр подкласса абстрактного класса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo). Эти объекты [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) содержат информацию о смещении от UTC, названии часового пояса и о том, действует ли летнее время.4445Модуль [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) предоставляет только один конкретный класс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) – класс [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone). Класс [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) может представлять простые часовые пояса с фиксированным смещением от UTC, например, сам UTC или североамериканские часовые пояса EST и EDT. Поддержка часовых поясов с более глубокой детализацией остаётся на усмотрение приложения. Правила корректировки времени по всему миру скорее политические, чем рациональные, часто меняются, и не существует стандарта, подходящего для каждого приложения, кроме UTC.4647## Константы4849Модуль [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) экспортирует следующие константы:5051#### `datetime.MINYEAR`5253Наименьший номер года, допустимый в объекте [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). [`MINYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MINYEAR) равен `1`.5455#### `datetime.MAXYEAR`5657Наибольший номер года, допустимый в объекте [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). [`MAXYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MAXYEAR) равен `9999`.5859## Доступные типы6061#### `class datetime.date`6263Идеализированная наивная дата, предполагающая, что текущий григорианский календарь действовал всегда и будет действовать всегда. Атрибуты: [`year`](https://python-all.ru/3.9/library/datetime.html#datetime.date.year), [`month`](https://python-all.ru/3.9/library/datetime.html#datetime.date.month) и [`day`](https://python-all.ru/3.9/library/datetime.html#datetime.date.day).6465#### `class datetime.time`6667Идеализированное время, независимое от какого-либо конкретного дня, предполагающее, что каждый день содержит ровно 24\*60\*60 секунд. (Здесь нет понятия «високосные секунды».) Атрибуты: [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.time.hour), [`minute`](https://python-all.ru/3.9/library/datetime.html#datetime.time.minute), [`second`](https://python-all.ru/3.9/library/datetime.html#datetime.time.second), [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.time.microsecond) и [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo).6869#### `class datetime.datetime`7071Комбинация даты и времени. Атрибуты: [`year`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.year), [`month`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.month), [`day`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.day), [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.hour), [`minute`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.minute), [`second`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.second), [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.microsecond), и [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo).7273#### `class datetime.timedelta`7475Продолжительность, выражающая разницу между двумя экземплярами [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date), [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) с точностью до микросекунды.7677#### `class datetime.tzinfo`7879Абстрактный базовый класс для объектов информации о часовых поясах. Они используются классами [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) для предоставления настраиваемого понятия коррекции времени (например, для учёта часового пояса и/или летнего времени).8081#### `class datetime.timezone`8283Класс, реализующий абстрактный базовый класс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) в виде фиксированного смещения от UTC.8485Новое в версии 3.2.8687Объекты этих типов неизменяемы.8889Отношения подклассов:9091```python92object93    timedelta94    tzinfo95        timezone96    time97    date98        datetime99```100101### Общие свойства102103Типы [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) и [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) имеют следующие общие особенности:104105- Объекты этих типов неизменяемы.106- Объекты этих типов хешируемы, то есть их можно использовать в качестве ключей словаря.107- Объекты этих типов поддерживают эффективную сериализацию с помощью модуля [`pickle`](https://python-all.ru/3.9/library/pickle.html#module-pickle).108109### Определение, является ли объект осведомлённым или наивным110111Объекты типа [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) всегда naive.112113Объект типа [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) может быть aware или naive.114115Объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) *d* является осведомлённым, если выполняются оба следующих условия:1161171. `d.tzinfo` не является `None`1182. `d.tzinfo.utcoffset(d)` не возвращает `None`119120В противном случае *d* является наивным.121122Объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) *t* является осведомлённым, если выполняются оба следующих условия:1231241. `t.tzinfo` не является `None`1252. `t.tzinfo.utcoffset(None)` не возвращает `None`.126127В противном случае *t* является наивным.128129Различие между aware и naive не применимо к объектам [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) .130131## [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) Объекты132133Объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) представляет собой продолжительность, то есть разницу между двумя датами или моментами времени.134135#### `class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)`136137Все аргументы необязательны и по умолчанию равны `0`. Аргументы могут быть целыми числами или числами с плавающей запятой, а также могут быть положительными или отрицательными.138139Внутри хранятся только *days*, *seconds* и *microseconds*. Аргументы преобразуются в эти единицы:140141- Миллисекунда преобразуется в 1000 микросекунд.142- Минута преобразуется в 60 секунд.143- Час преобразуется в 3600 секунд.144- Неделя преобразуется в 7 дней.145146а затем дни, секунды и микросекунды нормализуются так, что представление уникально, с147148- `0 <= microseconds < 1000000`149- `0 <= seconds < 3600*24` (количество секунд в одном дне)150- `-999999999 <= days <= 999999999`151152Следующий пример показывает, как любые аргументы, кроме *days*, *seconds* и *microseconds*, «объединяются» и нормализуются в эти три результирующих атрибута:153154```python155>>> from datetime import timedelta156>>> delta = timedelta(157...     days=50,158...     seconds=27,159...     microseconds=10,160...     milliseconds=29000,161...     minutes=5,162...     hours=8,163...     weeks=2164... )165>>> # Остаются только дни, секунды и микросекунды166>>> delta167datetime.timedelta(days=64, seconds=29156, microseconds=10)168```169170Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, то дробные микросекунды, оставшиеся от всех аргументов, объединяются, и их сумма округляется до ближайшей микросекунды с использованием правила округления до ближайшего чётного. Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).171172Если нормализованное значение дней выходит за указанный диапазон, возбуждается [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError).173174Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например:175176```python177>>> from datetime import timedelta178>>> d = timedelta(microseconds=-1)179>>> (d.days, d.seconds, d.microseconds)180(-1, 86399, 999999)181```182183Атрибуты класса:184185#### `timedelta.min`186187Наиболее отрицательный объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta), `timedelta(-999999999)`.188189#### `timedelta.max`190191Наиболее положительный объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta), `timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)`.192193#### `timedelta.resolution`194195Наименьшая возможная разница между неравными [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) объектами, `timedelta(microseconds=1)`.196197Обратите внимание, что из-за нормализации `timedelta.max` \> `-timedelta.min`. `-timedelta.max` не представим как объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta).198199Атрибуты экземпляра (только для чтения):200201| Атрибут | Значение |202| --- | --- |203| `days` | От -999999999 до 999999999 включительно |204| `seconds` | От 0 до 86399 включительно |205| `microseconds` | От 0 до 999999 включительно |206207Поддерживаемые операции:208209| Операция | Результат |210| --- | --- |211| `t1 = t2 + t3` | Сумма *t2* и *t3*. После этого *t1*-*t2* == *t3* и *t1*-*t3* == *t2* истинны. (1) |212| `t1 = t2 - t3` | Разность *t2* и *t3*. После этого *t1* == *t2* - *t3* и *t2* == *t1* + *t3* истинны. (1)(6) |213| `t1 = t2 * i or t1 = i * t2` | Дельта, умноженная на целое число. После этого *t1* // i == *t2* истинно при условии `i != 0`. |214|  | В общем случае, *t1* \* i == *t1* \* (i-1) + *t1* является истинным. (1) |215| `t1 = t2 * f or t1 = f * t2` | Дельта, умноженная на число с плавающей запятой. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |216| `f = t2 / t3` | Деление (3) общей длительности *t2* на единицу интервала *t3*. Возвращает объект [`float`](https://python-all.ru/3.9/library/functions.html#float). |217| `t1 = t2 / f or t1 = t2 / i` | Дельта, делённая на число с плавающей запятой или целое число. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |218| `t1 = t2 // i` или `t1 = t2 // t3` | Вычисляется целая часть, а остаток (если он есть) отбрасывается. Во втором случае возвращается целое число. (3) |219| `t1 = t2 % t3` | Остаток вычисляется как объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta). (3) |220| `q, r = divmod(t1, t2)` | Вычисляет частное и остаток: `q = t1 // t2` (3) и `r = t1 % t2`. q – целое число, а r – объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta). |221| `+t1` | Возвращает объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) с тем же значением. (2) |222| `-t1` | эквивалентно [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta)(-*t1.days*, -*t1.seconds*, -*t1.microseconds*), и *t1* \* -1. (1)(4) |223| `abs(t)` | эквивалентно +*t*, когда `t.days >= 0`, и -*t*, когда `t.days < 0`. (2) |224| `str(t)` | Возвращает строку вида `[D day[s], ][H]H:MM:SS[.UUUUUU]`, где D отрицательно для отрицательного `t`. (5) |225| `repr(t)` | Возвращает строковое представление объекта [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) в виде вызова конструктора с каноническими значениями атрибутов. |226227Примечания:2282291. Это точное, но может привести к переполнению.2302. Это точное и не может привести к переполнению.2313. Деление на 0 вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.9/library/exceptions.html#ZeroDivisionError).2324. -*timedelta.max* не представимо в виде объекта [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta).2335. Строковые представления [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) объектов нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных объектов timedelta. Например:234235   ```python236   >>> timedelta(hours=-5)237   datetime.timedelta(days=-1, seconds=68400)238   >>> print(_)239   -1 day, 19:00:00240   ```2416. Выражение `t2 - t3` всегда будет равно выражению `t2 + (-t3)`, за исключением случая, когда t3 равно `timedelta.max`; в этом случае первое выражение даст результат, а второе вызовет переполнение.242243В дополнение к перечисленным выше операциям, объекты [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) поддерживают некоторые операции сложения и вычитания с объектами [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) и [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) (см. ниже).244245Изменено в версии 3.2: Теперь поддерживаются целочисленное деление и истинное деление объекта [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) на другой объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta), а также операции взятия остатка и функция [`divmod()`](https://python-all.ru/3.9/library/functions.html#divmod). Также теперь поддерживаются истинное деление и умножение объекта [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) на объект [`float`](https://python-all.ru/3.9/library/functions.html#float).246247Сравнение объектов [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) поддерживается, но с некоторыми оговорками.248249Сравнения `==` и `!=` *всегда* возвращают [`bool`](https://python-all.ru/3.9/library/functions.html#bool), независимо от типа сравниваемого объекта:250251```python252>>> from datetime import timedelta253>>> delta1 = timedelta(seconds=57)254>>> delta2 = timedelta(hours=25, seconds=2)255>>> delta2 != delta1256True257>>> delta2 == 5258False259```260261Для всех остальных сравнений (например, `<` и `>`), когда объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) сравнивается с объектом другого типа, возбуждается [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError):262263```python264>>> delta2 > delta1265True266>>> delta2 > 5267Traceback (most recent call last):268  File "<stdin>", line 1, in <module>269TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int'270```271272В логических контекстах объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) считается истинным тогда и только тогда, когда он не равен `timedelta(0)`.273274Методы экземпляра:275276#### `timedelta.total_seconds()`277278Возвращает общее количество секунд, содержащихся в интервале. Эквивалентно `td / timedelta(seconds=1)`. Для единиц интервала, отличных от секунд, используйте форму деления напрямую (например, `td / timedelta(microseconds=1)`).279280Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет точность до микросекунд.281282Новое в версии 3.2.283284### Примеры использования: [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta)285286Дополнительный пример нормализации:287288```python289>>> # Компоненты another_year в сумме составляют ровно 365 дней290>>> from datetime import timedelta291>>> year = timedelta(days=365)292>>> another_year = timedelta(weeks=40, days=84, hours=23,293...                          minutes=50, seconds=600)294>>> year == another_year295True296>>> year.total_seconds()29731536000.0298```299300Примеры арифметики [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta):301302```python303>>> from datetime import timedelta304>>> year = timedelta(days=365)305>>> ten_years = 10 * year306>>> ten_years307datetime.timedelta(days=3650)308>>> ten_years.days // 36530910310>>> nine_years = ten_years - year311>>> nine_years312datetime.timedelta(days=3285)313>>> three_years = nine_years // 3314>>> three_years, three_years.days // 365315(datetime.timedelta(days=1095), 3)316```317318## [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) Объекты319320Объект [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) представляет дату (год, месяц и день) в идеализированном календаре – текущем григорианском календаре, бесконечно расширенном в обе стороны.3213221 января 1 года называется днём номер 1, 2 января 1 года – днём номер 2 и так далее. [2](https://python-all.ru/3.9/library/datetime.html#id6)323324#### `class datetime.date(year, month, day)`325326Все аргументы обязательны. Аргументы должны быть целыми числами в следующих диапазонах:327328- `MINYEAR <= year <= MAXYEAR`329- `1 <= month <= 12`330- `1 <= day <= number of days in the given month and year`331332Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).333334Другие конструкторы – все методы класса:335336#### `classmethod date.today()`337338Возвращает текущую локальную дату.339340Это эквивалентно `date.fromtimestamp(time.time())`.341342#### `classmethod date.fromtimestamp(timestamp)`343344Возвращает локальную дату, соответствующую метке времени POSIX, такую, как возвращает функция [`time.time()`](https://python-all.ru/3.9/library/time.html#time.time).345346Это может вызвать [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError), если метка времени находится за пределами диапазона значений, поддерживаемого функцией C `localtime()` платформы, и [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) при ошибке `localtime()`. Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах, не соответствующих POSIX, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются функцией [`fromtimestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.fromtimestamp).347348Изменено в версии 3.3: Вызывает [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемого функцией `localtime()` платформы C. Вызывает [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) при ошибке `localtime()`.349350#### `classmethod date.fromordinal(ordinal)`351352Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1.353354[`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) вызывается, если только не `1 <= ordinal <= date.max.toordinal()`. Для любой даты *d*, `date.fromordinal(d.toordinal()) == d`.355356#### `classmethod date.fromisoformat(date_string)`357358Возвращает [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date), соответствующий *строке с датой*, заданной в формате `YYYY-MM-DD`:359360```python361>>> from datetime import date362>>> date.fromisoformat('2019-12-04')363datetime.date(2019, 12, 4)364```365366Это обратная операция по отношению к [`date.isoformat()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.isoformat). Она поддерживает только формат `YYYY-MM-DD`.367368Добавлено в версии 3.7.369370#### `classmethod date.fromisocalendar(year, week, day)`371372Возвращает [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date), соответствующий дате по календарю ISO, заданной годом, неделей и днём. Это обратная функция для [`date.isocalendar()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.isocalendar).373374Новое в версии 3.8.375376Атрибуты класса:377378#### `date.min`379380Самая ранняя представимая дата, `date(MINYEAR, 1, 1)`.381382#### `date.max`383384Самая поздняя представимая дата, `date(MAXYEAR, 12, 31)`.385386#### `date.resolution`387388Наименьшая возможная разница между неравными объектами дат, `timedelta(days=1)`.389390Атрибуты экземпляра (только для чтения):391392#### `date.year`393394От [`MINYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MAXYEAR) включительно.395396#### `date.month`397398От 1 до 12 включительно.399400#### `date.day`401402От 1 до количества дней в указанном месяце указанного года.403404Поддерживаемые операции:405406| Операция | Результат |407| --- | --- |408| `date2 = date1 + timedelta` | *date2* отстоит на `timedelta.days` дней от *date1*. (1) |409| `date2 = date1 - timedelta` | Вычисляет *date2* так, что `date2 + timedelta == date1`. (2) |410| `timedelta = date1 - date2` | (3) |411| `date1 < date2` | *date1* считается меньше *date2*, если *date1* предшествует *date2* во времени. (4) |412413Примечания:4144151. *date2* сдвигается вперёд во времени, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. После этого `date2 - date1 == timedelta.days`. `timedelta.seconds` и `timedelta.microseconds` игнорируются. [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError) возбуждается, если `date2.year` оказался бы меньше, чем [`MINYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MINYEAR), или больше, чем [`MAXYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MAXYEAR).4162. `timedelta.seconds` и `timedelta.microseconds` игнорируются.4173. Это точное вычисление, переполнение невозможно. timedelta.seconds и timedelta.microseconds равны 0, и date2 + timedelta == date1 после этого.4184. Другими словами, `date1 < date2` тогда и только тогда, когда `date1.toordinal() < date2.toordinal()`. Сравнение дат возбуждает [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError), если другой операнд не является объектом [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date). Однако `NotImplemented` возвращается вместо этого, если другой операнд имеет атрибут `timetuple()`. Этот хук даёт другим видам объектов даты возможность реализовать смешанное сравнение. Если нет, то когда объект [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) сравнивается с объектом другого типа, возбуждается [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. Последние случаи возвращают [`False`](https://python-all.ru/3.9/library/constants.html#False) или [`True`](https://python-all.ru/3.9/library/constants.html#True) соответственно.419420В булевом контексте все объекты [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) считаются истинными.421422Методы экземпляра:423424#### `date.replace(year=self.year, month=self.month, day=self.day)`425426Возвращает дату с тем же значением, за исключением тех параметров, которым заданы новые значения указанными именованными аргументами.427428Пример:429430```python431>>> from datetime import date432>>> d = date(2002, 12, 31)433>>> d.replace(day=26)434datetime.date(2002, 12, 26)435```436437#### `date.timetuple()`438439Возвращает [`time.struct_time`](https://python-all.ru/3.9/library/time.html#time.struct_time) такой, какой возвращается [`time.localtime()`](https://python-all.ru/3.9/library/time.html#time.localtime).440441Часы, минуты и секунды равны 0, а флаг DST равен -1.442443`d.timetuple()` эквивалентно:444445```python446time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))447```448449где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – номер дня в текущем году, начиная с `1` для 1 января.450451#### `date.toordinal()`452453Возвращает пролептический григорианский порядковый номер даты, где 1 января 1 года имеет порядковый номер 1. Для любого объекта [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) *d*, `date.fromordinal(d.toordinal()) == d`.454455#### `date.weekday()`456457Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. Например, `date(2002, 12, 4).weekday() == 2`, среда. См. также [`isoweekday()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.isoweekday).458459#### `date.isoweekday()`460461Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. Например, `date(2002, 12, 4).isoweekday() == 3`, среда. См. также [`weekday()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.weekday), [`isocalendar()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.isocalendar).462463#### `date.isocalendar()`464465Возвращает объект [именованный кортеж](https://python-all.ru/3.9/glossary.html#term-named-tuple) с тремя компонентами: `year`, `week` и `weekday`.466467Календарь ISO – широко используемый вариант григорианского календаря. [3](https://python-all.ru/3.9/library/datetime.html#id7)468469Год ISO состоит из 52 или 53 полных недель, причём неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя года ISO – это первая (григорианская) календарная неделя года, в которую входит четверг. Она называется неделей номер 1, и год ISO этого четверга совпадает с его григорианским годом.470471Например, 2004 год начинается в четверг, поэтому первая неделя года ISO 2004 начинается в понедельник, 29 декабря 2003 г., и заканчивается в воскресенье, 4 января 2004 г.:472473```python474>>> from datetime import date475>>> date(2003, 12, 29).isocalendar()476datetime.IsoCalendarDate(year=2004, week=1, weekday=1)477>>> date(2004, 1, 4).isocalendar()478datetime.IsoCalendarDate(year=2004, week=1, weekday=7)479```480481Изменено в версии 3.9: Результат изменён с кортежа на [именованный кортеж](https://python-all.ru/3.9/glossary.html#term-named-tuple).482483#### `date.isoformat()`484485Возвращает строку, представляющую дату в формате ISO 8601, `YYYY-MM-DD`:486487```python488>>> from datetime import date489>>> date(2002, 12, 4).isoformat()490'2002-12-04'491```492493Это обратная операция по отношению к [`date.fromisoformat()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.fromisoformat).494495#### `date.__str__()`496497Для даты *d*, `str(d)` эквивалентен `d.isoformat()`.498499#### `date.ctime()`500501Возвращает строку, представляющую дату:502503```python504>>> from datetime import date505>>> date(2002, 12, 4).ctime()506'Wed Dec  4 00:00:00 2002'507```508509`d.ctime()` эквивалентно:510511```python512time.ctime(time.mktime(d.timetuple()))513```514515на платформах, где нативная функция C `ctime()` (которую вызывает [`time.ctime()`](https://python-all.ru/3.9/library/time.html#time.ctime), но которую [`date.ctime()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.ctime) не вызывает) соответствует стандарту C.516517#### `date.strftime(format)`518519Возвращает строку, представляющую дату, задаваемую явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. Полный список директив форматирования см. в [поведении strftime() и strptime()](https://python-all.ru/3.9/library/datetime.html#strftime-strptime-behavior).520521#### `date.__format__(format)`522523То же, что и [`date.strftime()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.strftime). Это позволяет задать строку формата для объекта [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) в [форматированных строковых литералах](https://python-all.ru/3.9/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.9/library/stdtypes.html#str.format). Полный список директив форматирования см. в [Поведение strftime() и strptime()](https://python-all.ru/3.9/library/datetime.html#strftime-strptime-behavior).524525### Примеры использования: [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date)526527Пример подсчёта дней до события:528529```python530>>> import time531>>> from datetime import date532>>> today = date.today()533>>> today534datetime.date(2007, 12, 5)535>>> today == date.fromtimestamp(time.time())536True537>>> my_birthday = date(today.year, 6, 24)538>>> if my_birthday < today:539...     my_birthday = my_birthday.replace(year=today.year + 1)540>>> my_birthday541datetime.date(2008, 6, 24)542>>> time_to_birthday = abs(my_birthday - today)543>>> time_to_birthday.days544202545```546547Другие примеры работы с [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date):548549```pycon550>>> from datetime import date551>>> d = date.fromordinal(730920) # 730920-й день после 1.1.0001552>>> d553datetime.date(2002, 3, 11)554555>>> # Методы, связанные с форматированием строкового вывода556>>> d.isoformat()557'2002-03-11'558>>> d.strftime("%d/%m/%y")559'11/03/02'560>>> d.strftime("%A %d. %B %Y")561'Monday 11. March 2002'562>>> d.ctime()563'Mon Mar 11 00:00:00 2002'564>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")565'The day is 11, the month is March.'566567>>> # Методы для извлечения 'компонентов' в разных календарях568>>> t = d.timetuple()569>>> for i in t:     570...     print(i)5712002                # year5723                   # month57311                  # day5740575057605770                   # weekday (0 = Monday)57870                  # 70th day in the year579-1580>>> ic = d.isocalendar()581>>> for i in ic:    582...     print(i)5832002                # ISO year58411                  # ISO week number5851                   # ISO day number ( 1 = Monday )586587>>> # Объект date является неизменяемым; все операции создают новый объект588>>> d.replace(year=2005)589datetime.date(2005, 3, 11)590```591592## [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) Объекты593594Объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) – это единый объект, содержащий всю информацию из объекта [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) и объекта [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time).595596Как и объект [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) предполагает текущий григорианский календарь, расширенный в обе стороны; как и объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time), [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) предполагает, что в каждом дне ровно 3600\*24 секунд.597598Конструктор:599600#### `class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)`601602Аргументы *year*, *month* и *day* обязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo). Остальные аргументы должны быть целыми числами в следующих диапазонах:603604- `MINYEAR <= year <= MAXYEAR`,605- `1 <= month <= 12`,606- `1 <= day <= number of days in the given month and year`,607- `0 <= hour < 24`,608- `0 <= minute < 60`,609- `0 <= second < 60`,610- `0 <= microsecond < 1000000`,611- `fold in [0, 1]`.612613Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).614615Новое в версии 3.6: Добавлен аргумент `fold`.616617Другие конструкторы – все методы класса:618619#### `classmethod datetime.today()`620621Возвращает текущую локальную дату и время, с [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) `None`.622623Эквивалентно следующему:624625```python626datetime.fromtimestamp(time.time())627```628629См. также [`now()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.now), [`fromtimestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fromtimestamp).630631Этот метод функционально эквивалентен [`now()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.now), но без параметра `tz`.632633#### `classmethod datetime.now(tz=None)`634635Возвращает текущие локальные дату и время.636637Если необязательный аргумент *tz* равен `None` или не указан, это аналогично [`today()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.today), но, по возможности, обеспечивает большую точность, чем можно получить через метку времени [`time.time()`](https://python-all.ru/3.9/library/time.html#time.time) (например, это возможно на платформах, предоставляющих функцию C `gettimeofday()`).638639Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), а текущие дата и время преобразуются в часовой пояс *tz*.640641Эта функция предпочтительнее [`today()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.today) и [`utcnow()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.utcnow).642643#### `classmethod datetime.utcnow()`644645Возвращает текущие дату и время UTC, с [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) `None`.646647Это похоже на [`now()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.now), но возвращает текущие дату и время UTC в виде наивного объекта [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). Осведомлённый объект текущего времени UTC можно получить, вызвав `datetime.now(timezone.utc)`. См. также [`now()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.now).648649> **Предупреждение**650>651> Поскольку наивные объекты `datetime` многими методами `datetime` рассматриваются как местное время, для представления времени в UTC предпочтительнее использовать осведомлённые объекты datetime. Поэтому рекомендуемый способ создания объекта, представляющего текущее время в UTC, – вызов `datetime.now(timezone.utc)`.652653#### `classmethod datetime.fromtimestamp(timestamp, tz=None)`654655Возвращает локальные дату и время, соответствующие метке времени POSIX, такой как возвращается [`time.time()`](https://python-all.ru/3.9/library/time.html#time.time). Если необязательный аргумент *tz* равен `None` или не указан, метка времени преобразуется в локальные дату и время платформы, и возвращаемый объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) является наивным.656657Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), и метка времени преобразуется в часовой пояс *tz*.658659[`fromtimestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fromtimestamp) может возбуждать [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError), если метка времени выходит за диапазон значений, поддерживаемых платформенными функциями C `localtime()` или `gmtime()`, и [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) при ошибке `localtime()` или `gmtime()`. Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что на системах, не совместимых с POSIX, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются [`fromtimestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fromtimestamp), и поэтому возможно иметь две метки времени, различающиеся на секунду, которые дают идентичные объекты [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). Этот метод предпочтительнее [`utcfromtimestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.utcfromtimestamp).660661Изменено в версии 3.3: Возбуждает [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError), если метка времени выходит за диапазон значений, поддерживаемых платформенными функциями C `localtime()` или `gmtime()`. Возбуждает [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) при ошибке `localtime()` или `gmtime()`.662663Изменено в версии 3.6: [`fromtimestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fromtimestamp) может возвращать экземпляры с [`fold`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fold), установленным в 1.664665#### `classmethod datetime.utcfromtimestamp(timestamp)`666667Возвращает [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) UTC, соответствующий метке времени POSIX, с [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) `None`. (Результирующий объект является наивным.)668669Это может возбуждать [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError), если метка времени выходит за диапазон значений, поддерживаемых платформенной функцией C `gmtime()`, и [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) при ошибке `gmtime()`. Обычно это ограничено годами с 1970 по 2038.670671Чтобы получить осведомлённый объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), вызовите [`fromtimestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fromtimestamp):672673```python674datetime.fromtimestamp(timestamp, timezone.utc)675```676677На платформах, совместимых с POSIX, это эквивалентно следующему выражению:678679```python680datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)681```682683за исключением того, что последняя формула всегда поддерживает полный диапазон лет: от [`MINYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MAXYEAR) включительно.684685> **Предупреждение**686>687> Поскольку наивные объекты `datetime` во многих методах `datetime` трактуются как местное время, для представления времени в UTC предпочтительнее использовать aware-даты. Поэтому рекомендуемый способ создания объекта для конкретной метки времени в UTC – вызов `datetime.fromtimestamp(timestamp, tz=timezone.utc)`.688689Изменено в версии 3.3: Вызывает [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемого функцией `gmtime()` платформы C. Вызывает [`OSError`](https://python-all.ru/3.9/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) при ошибке `gmtime()`.690691#### `classmethod datetime.fromordinal(ordinal)`692693Возвращает [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1. [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) возникает, если не выполнено `1 <= ordinal <= datetime.max.toordinal()`. Час, минута, секунда и микросекунда результата равны 0, а [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) равно `None`.694695#### `classmethod datetime.combine(date, time, tzinfo=self.tzinfo)`696697Возвращает новый объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), компоненты даты которого равны компонентам даты заданного объекта [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date), а компоненты времени равны компонентам времени заданного объекта [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time). Если указан аргумент *tzinfo*, его значение используется для установки атрибута [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) результата; в противном случае используется атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo) аргумента *time*.698699Для любого объекта [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) *d* `d == datetime.combine(d.date(), d.time(), d.tzinfo)`. Если date является объектом [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), его компоненты времени и атрибуты [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) игнорируются.700701Изменено в версии 3.6: Добавлен аргумент *tzinfo*.702703#### `classmethod datetime.fromisoformat(date_string)`704705Возвращает [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), соответствующий *date\_string* в одном из форматов, выдаваемых [`date.isoformat()`](https://python-all.ru/3.9/library/datetime.html#datetime.date.isoformat) и [`datetime.isoformat()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.isoformat).706707В частности, эта функция поддерживает строки в формате:708709```text710YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]711```712713где `*` может соответствовать любому одиночному символу.714715> **Внимание**716>717> Эта функция *не* предназначена для разбора произвольных строк ISO 8601 – она лишь служит обратной операцией к [`datetime.isoformat()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.isoformat). Более полнофункциональный парсер ISO 8601, `dateutil.parser.isoparse`, доступен в стороннем пакете [dateutil](https://python-all.ru/3.9/library/datetime.html).718719Примеры:720721```python722>>> from datetime import datetime723>>> datetime.fromisoformat('2011-11-04')724datetime.datetime(2011, 11, 4, 0, 0)725>>> datetime.fromisoformat('2011-11-04T00:05:23')726datetime.datetime(2011, 11, 4, 0, 5, 23)727>>> datetime.fromisoformat('2011-11-04 00:05:23.283')728datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)729>>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')730datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)731>>> datetime.fromisoformat('2011-11-04T00:05:23+04:00')   732datetime.datetime(2011, 11, 4, 0, 5, 23,733    tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))734```735736Добавлено в версии 3.7.737738#### `classmethod datetime.fromisocalendar(year, week, day)`739740Возвращает [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), соответствующий дате по ISO-календарю, заданной годом, неделей и днём. Компоненты datetime, не относящиеся к дате, заполняются обычными значениями по умолчанию. Это обратная функция для [`datetime.isocalendar()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.isocalendar).741742Новое в версии 3.8.743744#### `classmethod datetime.strptime(date_string, format)`745746Возвращает объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), соответствующий *date\_string*, разобранный в соответствии с *format*.747748Это эквивалентно:749750```python751datetime(*(time.strptime(date_string, format)[0:6]))752```753754[`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) возбуждается, если date\_string и format не могут быть разобраны с помощью [`time.strptime()`](https://python-all.ru/3.9/library/time.html#time.strptime) или если возвращается значение, не являющееся временным кортежем. Полный список директив форматирования см. в [Поведение strftime() и strptime()](https://python-all.ru/3.9/library/datetime.html#strftime-strptime-behavior).755756Атрибуты класса:757758#### `datetime.min`759760Самое раннее представимое [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), `datetime(MINYEAR, 1, 1, tzinfo=None)`.761762#### `datetime.max`763764Самое позднее представимое [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), `datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)`.765766#### `datetime.resolution`767768Наименьшая возможная разница между неравными [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) объектами, `timedelta(microseconds=1)`.769770Атрибуты экземпляра (только для чтения):771772#### `datetime.year`773774От [`MINYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MAXYEAR) включительно.775776#### `datetime.month`777778От 1 до 12 включительно.779780#### `datetime.day`781782От 1 до количества дней в указанном месяце указанного года.783784#### `datetime.hour`785786В `range(24)`.787788#### `datetime.minute`789790В `range(60)`.791792#### `datetime.second`793794В `range(60)`.795796#### `datetime.microsecond`797798В `range(1000000)`.799800#### `datetime.tzinfo`801802Объект, переданный в качестве аргумента *tzinfo* конструктору [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), или `None`, если ничего не было передано.803804#### `datetime.fold`805806В `[0, 1]`. Используется для разрешения неоднозначности местного времени в повторяющийся интервал. (Повторяющийся интервал возникает, когда часы переводятся назад в конце перехода на летнее время или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значение 0 (1) представляет более ранний (поздний) из двух моментов с одинаковым местным временем.807808Новое в версии 3.6.809810Поддерживаемые операции:811812| Операция | Результат |813| --- | --- |814| `datetime2 = datetime1 + timedelta` | (1) |815| `datetime2 = datetime1 - timedelta` | (2) |816| `timedelta = datetime1 - datetime2` | (3) |817| `datetime1 < datetime2` | Сравнивает [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) с [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). (4) |8188191. datetime2 – это длительность timedelta, вычтенная из datetime1, то есть перемещение вперед во времени, если `timedelta.days` \> 0, или назад, если `timedelta.days` \< 0. Результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo), что и исходный datetime, и datetime2 - datetime1 == timedelta после вычитания. [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError) вызывается, если datetime2.year будет меньше [`MINYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.9/library/datetime.html#datetime.MAXYEAR). Обратите внимание, что корректировка часового пояса не производится, даже если входной объект является осведомленным (aware).8202. Вычисляет datetime2 таким образом, что datetime2 + timedelta == datetime1. Как и в случае сложения, результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo), что и входной datetime, и корректировка часового пояса не производится, даже если входной объект является осведомленным.8213. Вычитание [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) из [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) определено только если оба операнда наивны или оба осведомлены. Если один осведомлён, а другой наивен, возникает [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError).822823   Если оба наивны, или оба осведомлены и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo), то атрибуты [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) игнорируются, и результатом является объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) *t* такой, что `datetime2 + t == datetime1`. В этом случае корректировка часового пояса не производится.824825   Если оба объекта являются aware и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo), то `a-b` действует так, как если бы *a* и *b* сначала были преобразованы в наивные UTC-даты и время. Результат – `(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`, за исключением того, что реализация никогда не вызывает переполнения.8264. *datetime1* считается меньше *datetime2*, когда *datetime1* предшествует *datetime2* по времени.827828   Если один операнд сравнения является наивным (naive), а другой – aware, то [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError) возбуждается при попытке упорядочивающего сравнения. Для сравнений на равенство наивные экземпляры никогда не равны aware-экземплярам.829830   Если оба операнда сравнения являются aware и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) игнорируется и сравниваются базовые даты и время. Если оба операнда aware и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo), операнды сначала корректируются вычитанием их UTC-смещений (полученных из `self.utcoffset()`).831832   Изменено в версии 3.3: Сравнения на равенство между осознающими и наивными экземплярами [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) не вызывают [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError).833834   > **Примечание**835   >836   > Чтобы сравнение не переходило к стандартной схеме сравнения адресов объектов, сравнение datetime обычно возбуждает [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError), если другой операнд не является объектом [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). Однако `NotImplemented` возвращается, если другой операнд имеет атрибут `timetuple()`. Этот хук даёт другим видам объектов даты возможность реализовать смешанное сравнение. В противном случае, когда объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) сравнивается с объектом другого типа, возбуждается [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. В последних двух случаях возвращается соответственно [`False`](https://python-all.ru/3.9/library/constants.html#False) или [`True`](https://python-all.ru/3.9/library/constants.html#True).837838Методы экземпляра:839840#### `datetime.date()`841842Возвращает объект [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) с тем же годом, месяцем и днём.843844#### `datetime.time()`845846Возвращает объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) с теми же часами, минутами, секундами, микросекундами и fold. [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) равно `None`. См. также метод [`timetz()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.timetz).847848Изменено в версии 3.6: Значение fold копируется в возвращаемый объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time).849850#### `datetime.timetz()`851852Возвращает объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) с теми же атрибутами hour, minute, second, microsecond, fold и tzinfo. См. также метод [`time()`](https://python-all.ru/3.9/library/time.html#module-time).853854Изменено в версии 3.6: Значение fold копируется в возвращаемый объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time).855856#### `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)`857858Возвращает datetime с теми же атрибутами, за исключением тех, для которых заданы новые значения с помощью переданных именованных аргументов. Обратите внимание: `tzinfo=None` можно указать, чтобы создать наивный datetime из осведомленного datetime без преобразования данных о дате и времени.859860Новое в версии 3.6: Добавлен аргумент `fold`.861862#### `datetime.astimezone(tz=None)`863864Возвращает объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) с новым атрибутом [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) *tz*, корректируя данные даты и времени так, чтобы результат соответствовал тому же времени UTC, что и *self*, но в местном времени *tz*.865866Если передан, *tz* должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), и его методы [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.utcoffset) и [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.dst) не должны возвращать `None`. Если *self* является наивным, то предполагается, что он представляет время в системном часовом поясе.867868Если вызывается без аргументов (или с `tz=None`), целевой часовой пояс считается системным местным. Атрибут `.tzinfo` преобразованного экземпляра datetime будет установлен в экземпляр [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) с именем зоны и смещением, полученными от ОС.869870Если `self.tzinfo` равно *tz*, `self.astimezone(tz)` равно *self*: никакой корректировки данных о дате или времени не выполняется. В противном случае результатом является местное время в часовом поясе *tz*, представляющее то же UTC-время, что и *self*: после `astz = dt.astimezone(tz)` `astz - astz.utcoffset()` будет иметь те же данные о дате и времени, что и `dt - dt.utcoffset()`.871872Если нужно просто прикрепить объект часового пояса *tz* к datetime *dt* без корректировки данных о дате и времени, используйте `dt.replace(tzinfo=tz)`. Если нужно просто удалить объект часового пояса из осведомленного datetime *dt* без преобразования данных о дате и времени, используйте `dt.replace(tzinfo=None)`.873874Обратите внимание, что метод по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc) можно переопределить в подклассе [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), чтобы повлиять на результат, возвращаемый [`astimezone()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.astimezone). Если не учитывать ошибки, [`astimezone()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.astimezone) работает следующим образом:875876```python877def astimezone(self, tz):878    if self.tzinfo is tz:879        return self880    # Преобразует self в UTC и присоединяет новый объект временной зоны.881    utc = (self - self.utcoffset()).replace(tzinfo=tz)882    # Преобразует из UTC в местное время tz.883    return tz.fromutc(utc)884```885886Изменено в версии 3.3: *tz* теперь можно опускать.887888Изменено в версии 3.6: Метод [`astimezone()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.astimezone) теперь можно вызывать для наивных экземпляров, которые считаются представляющими системное местное время.889890#### `datetime.utcoffset()`891892Если [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(self)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) с величиной менее одного дня.893894Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.895896#### `datetime.dst()`897898Если [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращается `None`, иначе возвращается `self.tzinfo.dst(self)`, и возбуждается исключение, если последний не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) с величиной меньше одного дня.899900Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.901902#### `datetime.tzname()`903904Если [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращается `None`, иначе возвращается `self.tzinfo.tzname(self)`, возбуждается исключение, если последний не возвращает `None` или строковый объект,905906#### `datetime.timetuple()`907908Возвращает [`time.struct_time`](https://python-all.ru/3.9/library/time.html#time.struct_time) такой, какой возвращается [`time.localtime()`](https://python-all.ru/3.9/library/time.html#time.localtime).909910`d.timetuple()` эквивалентно:911912```python913time.struct_time((d.year, d.month, d.day,914                  d.hour, d.minute, d.second,915                  d.weekday(), yday, dst))916```917918где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – это номер дня в текущем году, начиная с `1` для 1 января. Флаг `tm_isdst` результата устанавливается в соответствии с методом [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.dst): если [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo) равно `None` или [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.dst) возвращает `None`, то `tm_isdst` устанавливается в `-1`; иначе, если [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.dst) возвращает ненулевое значение, `tm_isdst` устанавливается в `1`; иначе `tm_isdst` устанавливается в `0`.919920#### `datetime.utctimetuple()`921922Если экземпляр [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) *d* является наивным, то это то же самое, что `d.timetuple()`, за исключением того, что `tm_isdst` принудительно устанавливается в 0 независимо от того, что возвращает `d.dst()`. Летнее время никогда не действует для UTC-времени.923924Если *d* является осведомленным, то *d* нормализуется к UTC-времени путем вычитания `d.utcoffset()`, и возвращается [`time.struct_time`](https://python-all.ru/3.9/library/time.html#time.struct_time) для нормализованного времени. `tm_isdst` принудительно устанавливается в 0. Обратите внимание, что может возникнуть [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError), если *d*.year был `MINYEAR` или `MAXYEAR` и корректировка UTC выходит за границу года.925926> **Предупреждение**927>928> Поскольку наивные объекты `datetime` рассматриваются многими методами `datetime` как местное время, предпочтительнее использовать осознанные объекты datetime для представления времени в UTC; как результат, использование `utcfromtimetuple` может давать вводящие в заблуждение результаты. Если у вас есть наивный `datetime`, представляющий UTC, используйте `datetime.replace(tzinfo=timezone.utc)`, чтобы сделать его осознанным, после чего можно использовать [`datetime.timetuple()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.timetuple).929930#### `datetime.toordinal()`931932Возвращает пролептический григорианский порядковый номер даты. То же, что `self.date().toordinal()`.933934#### `datetime.timestamp()`935936Возвращает временную метку POSIX, соответствующую экземпляру [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). Возвращаемое значение – [`float`](https://python-all.ru/3.9/library/functions.html#float), похожее на то, что возвращается [`time.time()`](https://python-all.ru/3.9/library/time.html#time.time).937938Считается, что наивные экземпляры [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) представляют местное время, и этот метод полагается на функцию `mktime()` платформы C для выполнения преобразования. Поскольку [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) поддерживает более широкий диапазон значений, чем `mktime()` на многих платформах, этот метод может вызывать [`OverflowError`](https://python-all.ru/3.9/library/exceptions.html#OverflowError) для времен, далеких в прошлом или далеких в будущем.939940Для осознанных экземпляров [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) возвращаемое значение вычисляется как:941942```python943(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()944```945946Новое в версии 3.3.947948Изменено в версии 3.6: Метод [`timestamp()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.timestamp) использует атрибут [`fold`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fold) для устранения неоднозначности моментов времени в течение повторяющегося интервала.949950> **Примечание**951>952> Не существует метода для получения POSIX-метки времени непосредственно из наивного экземпляра [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), представляющего время UTC. Если ваше приложение использует это соглашение и системный часовой пояс не установлен в UTC, вы можете получить POSIX-метку времени, передав `tzinfo=timezone.utc`:953>954> ```python955> timestamp = dt.replace(tzinfo=timezone.utc).timestamp()956> ```957>958> или вычислив метку напрямую:959>960> ```python961> timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)962> ```963964#### `datetime.weekday()`965966Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. То же, что `self.date().weekday()`. См. также [`isoweekday()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.isoweekday).967968#### `datetime.isoweekday()`969970Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. То же, что `self.date().isoweekday()`. См. также [`weekday()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.weekday), [`isocalendar()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.isocalendar).971972#### `datetime.isocalendar()`973974Возвращает [именованный кортеж](https://python-all.ru/3.9/glossary.html#term-named-tuple) с тремя компонентами: `year`, `week` и `weekday`. То же, что `self.date().isocalendar()`.975976#### `datetime.isoformat(sep='T', timespec='auto')`977978Возвращает строку, представляющую дату и время в формате ISO 8601:979980- `YYYY-MM-DDTHH:MM:SS.ffffff`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.microsecond) не равно 0981- `YYYY-MM-DDTHH:MM:SS`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.microsecond) равно 0982983Если [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.utcoffset) не возвращает `None`, добавляется строка с указанием смещения UTC:984985- `YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.microsecond) не равно 0986- `YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.microsecond) равно 0987988Примеры:989990```python991>>> from datetime import datetime, timezone992>>> datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()993'2019-05-18T15:17:08.132263'994>>> datetime(2019, 5, 18, 15, 17, tzinfo=timezone.utc).isoformat()995'2019-05-18T15:17:00+00:00'996```997998Необязательный аргумент *sep* (по умолчанию `'T'`) – это односимвольный разделитель, который ставится между частями даты и времени результата. Например:9991000```python1001>>> from datetime import tzinfo, timedelta, datetime1002>>> class TZ(tzinfo):1003...     """Часовой пояс с произвольным постоянным смещением -06:39."""1004...     def utcoffset(self, dt):1005...         return timedelta(hours=-6, minutes=-39)1006...1007>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')1008'2002-12-25 00:00:00-06:39'1009>>> datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()1010'2009-11-27T00:00:00.000100-06:39'1011```10121013Необязательный аргумент *timespec* указывает количество дополнительных компонентов времени, которые нужно включить (по умолчанию `'auto'`). Он может быть одним из следующих:10141015- `'auto'`: То же, что и `'seconds'`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.microsecond) равно 0, иначе то же, что и `'microseconds'`.1016- `'hours'`: Включает [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.hour) в двухзначном формате `HH`.1017- `'minutes'`: Включает [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.hour) и [`minute`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.minute) в формате `HH:MM`.1018- `'seconds'`: Включает [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.hour), [`minute`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.minute) и [`second`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.second) в формате `HH:MM:SS`.1019- `'milliseconds'`: Включает полное время, но усекает дробную часть секунд до миллисекунд. Формат `HH:MM:SS.sss`.1020- `'microseconds'`: Включает полное время в формате `HH:MM:SS.ffffff`.10211022> **Примечание**1023>1024> Исключённые компоненты времени усекаются, а не округляются.10251026[`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) будет возбуждено при недопустимом значении аргумента *timespec*:10271028```python1029>>> from datetime import datetime1030>>> datetime.now().isoformat(timespec='minutes')   1031'2002-12-25T00:00'1032>>> dt = datetime(2015, 1, 1, 12, 30, 59, 0)1033>>> dt.isoformat(timespec='microseconds')1034'2015-01-01T12:30:59.000000'1035```10361037Новое в версии 3.6: Добавлен аргумент *timespec*.10381039#### `datetime.__str__()`10401041Для экземпляра [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) *d*, `str(d)` эквивалентно `d.isoformat(' ')`.10421043#### `datetime.ctime()`10441045Возвращает строку, представляющую дату и время:10461047```python1048>>> from datetime import datetime1049>>> datetime(2002, 12, 4, 20, 30, 40).ctime()1050'Wed Dec  4 20:30:40 2002'1051```10521053Результирующая строка *не* содержит информацию о часовом поясе независимо от того, является ли исходный объект aware или naive.10541055`d.ctime()` эквивалентно:10561057```python1058time.ctime(time.mktime(d.timetuple()))1059```10601061на платформах, где нативная C-функция `ctime()` (которая вызывается в [`time.ctime()`](https://python-all.ru/3.9/library/time.html#time.ctime), но не вызывается в [`datetime.ctime()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.ctime)) соответствует стандарту C.10621063#### `datetime.strftime(format)`10641065Возвращает строку, представляющую дату и время, управляемую явной строкой формата. Полный список директив форматирования см. в [Поведение strftime() и strptime()](https://python-all.ru/3.9/library/datetime.html#strftime-strptime-behavior).10661067#### `datetime.__format__(format)`10681069То же, что и [`datetime.strftime()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.strftime). Это позволяет задать строку формата для объекта [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) в [форматированных строковых литералах](https://python-all.ru/3.9/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.9/library/stdtypes.html#str.format). Полный список директив форматирования см. в [Поведение strftime() и strptime()](https://python-all.ru/3.9/library/datetime.html#strftime-strptime-behavior).10701071### Примеры использования: [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime)10721073Примеры работы с объектами [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime):10741075```pycon1076>>> from datetime import datetime, date, time, timezone10771078>>> # Использование datetime.combine()1079>>> d = date(2005, 7, 14)1080>>> t = time(12, 30)1081>>> datetime.combine(d, t)1082datetime.datetime(2005, 7, 14, 12, 30)10831084>>> # Использование datetime.now()1085>>> datetime.now()   1086datetime.datetime(2007, 12, 6, 16, 29, 43, 79043)   # GMT +11087>>> datetime.now(timezone.utc)   1088datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)10891090>>> # Использование datetime.strptime()1091>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")1092>>> dt1093datetime.datetime(2006, 11, 21, 16, 30)10941095>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов1096>>> tt = dt.timetuple()1097>>> for it in tt:   1098...     print(it)1099...11002006    # year110111      # month110221      # day110316      # hour110430      # minute11050       # second11061       # weekday (0 = Monday)1107325     # number of days since 1st January1108-1      # dst - method tzinfo.dst() returned None11091110>>> # Дата в формате ISO1111>>> ic = dt.isocalendar()1112>>> for it in ic:   1113...     print(it)1114...11152006    # ISO year111647      # ISO week11172       # ISO weekday11181119>>> # Форматирование datetime1120>>> dt.strftime("%A, %d. %B %Y %I:%M%p")1121'Tuesday, 21. November 2006 04:30PM'1122>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")1123'The day is 21, the month is November, the time is 04:30PM.'1124```11251126В приведённом ниже примере определяется подкласс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), который фиксирует информацию о часовом поясе для Кабула (Афганистан). До 1945 года там использовалось смещение +4 UTC, а затем +4:30 UTC:11271128```python1129from datetime import timedelta, datetime, tzinfo, timezone11301131class KabulTz(tzinfo):1132    # В Кабуле до 1945 года использовали +4, затем перешли на +4:301133    UTC_MOVE_DATE = datetime(1944, 12, 31, 20, tzinfo=timezone.utc)11341135    def utcoffset(self, dt):1136        if dt.year < 1945:1137            return timedelta(hours=4)1138        elif (1945, 1, 1, 0, 0) <= dt.timetuple()[:5] < (1945, 1, 1, 0, 30):1139            # Неоднозначный («мнимый») получасовой диапазон, представляющий1140            # «складку» во времени из-за перехода с +4 на +4:30.1141            # Если dt попадает в мнимый диапазон, используйте fold для определения способа1142            # разрешения. См. PEP495.1143            return timedelta(hours=4, minutes=(30 if dt.fold else 0))1144        else:1145            return timedelta(hours=4, minutes=30)11461147    def fromutc(self, dt):1148        # Следуйте тем же проверкам, что и в datetime.tzinfo1149        if not isinstance(dt, datetime):1150            raise TypeError("fromutc() requires a datetime argument")1151        if dt.tzinfo is not self:1152            raise ValueError("dt.tzinfo is not self")11531154        # Для fromutc требуется собственная реализация, так как1155        # входные данные для этой функции – это datetime со значениями UTC1156        # но с tzinfo, установленным на self.1157        # См. datetime.astimezone или fromtimestamp.1158        if dt.replace(tzinfo=timezone.utc) >= self.UTC_MOVE_DATE:1159            return dt + timedelta(hours=4, minutes=30)1160        else:1161            return dt + timedelta(hours=4)11621163    def dst(self, dt):1164        # В Кабуле не соблюдается летнее время.1165        return timedelta(0)11661167    def tzname(self, dt):1168        if dt >= self.UTC_MOVE_DATE:1169            return "+04:30"1170        return "+04"1171```11721173Использование `KabulTz` из примера выше:11741175```python1176>>> tz1 = KabulTz()11771178>>> # Datetime до изменения1179>>> dt1 = datetime(1900, 11, 21, 16, 30, tzinfo=tz1)1180>>> print(dt1.utcoffset())11814:00:0011821183>>> # Datetime после изменения1184>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=tz1)1185>>> print(dt2.utcoffset())11864:30:0011871188>>> # Преобразовать datetime в другой часовой пояс1189>>> dt3 = dt2.astimezone(timezone.utc)1190>>> dt31191datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)1192>>> dt21193datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())1194>>> dt2 == dt31195True1196```11971198## [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) Объекты11991200Объект [`time`](https://python-all.ru/3.9/library/time.html#module-time) представляет (локальное) время суток, не привязанное к определённому дню и может корректироваться с помощью объекта [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo).12011202#### `class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)`12031204Все аргументы необязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo). Остальные аргументы должны быть целыми числами в следующих диапазонах:12051206- `0 <= hour < 24`,1207- `0 <= minute < 60`,1208- `0 <= second < 60`,1209- `0 <= microsecond < 1000000`,1210- `fold in [0, 1]`.12111212Если передан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError). Все по умолчанию равны `0`, за исключением *tzinfo*, который по умолчанию равен [`None`](https://python-all.ru/3.9/library/constants.html#None).12131214Атрибуты класса:12151216#### `time.min`12171218Самое раннее представимое [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time), `time(0, 0, 0, 0)`.12191220#### `time.max`12211222Самое позднее представимое [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time), `time(23, 59, 59, 999999)`.12231224#### `time.resolution`12251226Наименьшая возможная разница между неравными объектами [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time), `timedelta(microseconds=1)`, хотя следует отметить, что арифметические операции над объектами [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) не поддерживаются.12271228Атрибуты экземпляра (только для чтения):12291230#### `time.hour`12311232В `range(24)`.12331234#### `time.minute`12351236В `range(60)`.12371238#### `time.second`12391240В `range(60)`.12411242#### `time.microsecond`12431244В `range(1000000)`.12451246#### `time.tzinfo`12471248Объект, переданный как аргумент tzinfo конструктору [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time), или `None`, если ничего не было передано.12491250#### `time.fold`12511252В `[0, 1]`. Используется для разрешения неоднозначности местного времени в повторяющийся интервал. (Повторяющийся интервал возникает, когда часы переводятся назад в конце перехода на летнее время или когда смещение UTC для текущей зоны уменьшается по политическим причинам.) Значение 0 (1) представляет более ранний (поздний) из двух моментов с одинаковым местным временем.12531254Новое в версии 3.6.12551256Объекты [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) поддерживают сравнение [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) с [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time), где *a* считается меньше *b*, когда *a* предшествует *b* по времени. Если один операнд сравнения является наивным (naive), а другой – aware, то [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError) возбуждается при попытке упорядочивающего сравнения. Для сравнений на равенство наивные экземпляры никогда не равны aware-экземплярам.12571258Если оба операнда сравнения являются aware и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo) игнорируется и сравниваются базовые времена. Если оба операнда aware и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo), операнды сначала корректируются вычитанием их UTC-смещений (полученных из `self.utcoffset()`). Чтобы предотвратить переход смешанных сравнений к сравнению по умолчанию через адрес объекта, когда объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) сравнивается с объектом другого типа, возбуждается [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. В последних двух случаях возвращается соответственно [`False`](https://python-all.ru/3.9/library/constants.html#False) или [`True`](https://python-all.ru/3.9/library/constants.html#True).12591260Изменено в версии 3.3: Сравнения на равенство между осведомлёнными и наивными экземплярами [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) не вызывают [`TypeError`](https://python-all.ru/3.9/library/exceptions.html#TypeError).12611262В булевом контексте объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) всегда считается истинным.12631264Изменено в версии 3.5: До Python 3.5 объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) считался ложным, если он представлял полночь в UTC. Это поведение считалось неочевидным и чреватым ошибками и было удалено в Python 3.5. См. [bpo-13936](https://python-all.ru/3.9/library/datetime.html) для получения полной информации.12651266Другой конструктор:12671268#### `classmethod time.fromisoformat(time_string)`12691270Возвращает [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time), соответствующий *time\_string* в одном из форматов, выдаваемых [`time.isoformat()`](https://python-all.ru/3.9/library/datetime.html#datetime.time.isoformat). В частности, эта функция поддерживает строки в формате:12711272```text1273HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]1274```12751276> **Внимание**1277>1278> Эта функция *не* поддерживает разбор произвольных строк ISO 8601. Она предназначена только для обратной операции к [`time.isoformat()`](https://python-all.ru/3.9/library/datetime.html#datetime.time.isoformat).12791280Примеры:12811282```python1283>>> from datetime import time1284>>> time.fromisoformat('04:23:01')1285datetime.time(4, 23, 1)1286>>> time.fromisoformat('04:23:01.000384')1287datetime.time(4, 23, 1, 384)1288>>> time.fromisoformat('04:23:01+04:00')1289datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))1290```12911292Добавлено в версии 3.7.12931294Методы экземпляра:12951296#### `time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)`12971298Возвращает [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) с теми же значениями, за исключением атрибутов, которым заданы новые значения через указанные именованные аргументы. Обратите внимание, что `tzinfo=None` можно указать для создания наивного [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) из осведомлённого [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) без преобразования временных данных.12991300Новое в версии 3.6: Добавлен аргумент `fold`.13011302#### `time.isoformat(timespec='auto')`13031304Возвращает строку, представляющую время в формате ISO 8601, одну из:13051306- `HH:MM:SS.ffffff`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.time.microsecond) не равно 01307- `HH:MM:SS`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.time.microsecond) равно 01308- `HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]`, если [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.time.utcoffset) не возвращает `None`1309- `HH:MM:SS+HH:MM[:SS[.ffffff]]`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.time.microsecond) равно 0 и [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.time.utcoffset) не возвращает `None`13101311Необязательный аргумент *timespec* указывает количество дополнительных компонентов времени, которые нужно включить (по умолчанию `'auto'`). Он может быть одним из следующих:13121313- `'auto'`: То же, что и `'seconds'`, если [`microsecond`](https://python-all.ru/3.9/library/datetime.html#datetime.time.microsecond) равно 0, иначе то же, что и `'microseconds'`.1314- `'hours'`: Включает [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.time.hour) в двухзначном формате `HH`.1315- `'minutes'`: Включает [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.time.hour) и [`minute`](https://python-all.ru/3.9/library/datetime.html#datetime.time.minute) в формате `HH:MM`.1316- `'seconds'`: Включает [`hour`](https://python-all.ru/3.9/library/datetime.html#datetime.time.hour), [`minute`](https://python-all.ru/3.9/library/datetime.html#datetime.time.minute) и [`second`](https://python-all.ru/3.9/library/datetime.html#datetime.time.second) в формате `HH:MM:SS`.1317- `'milliseconds'`: Включает полное время, но усекает дробную часть секунд до миллисекунд. Формат `HH:MM:SS.sss`.1318- `'microseconds'`: Включает полное время в формате `HH:MM:SS.ffffff`.13191320> **Примечание**1321>1322> Исключённые компоненты времени усекаются, а не округляются.13231324[`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError) будет вызвано при недопустимом аргументе *timespec*.13251326Пример:13271328```python1329>>> from datetime import time1330>>> time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')1331'12:34'1332>>> dt = time(hour=12, minute=34, second=56, microsecond=0)1333>>> dt.isoformat(timespec='microseconds')1334'12:34:56.000000'1335>>> dt.isoformat(timespec='auto')1336'12:34:56'1337```13381339Новое в версии 3.6: Добавлен аргумент *timespec*.13401341#### `time.__str__()`13421343Для времени *t*, `str(t)` эквивалентно `t.isoformat()`.13441345#### `time.strftime(format)`13461347Возвращает строку, представляющую время, управляемую явной строкой формата. Полный список директив форматирования см. [Поведение strftime() и strptime()](https://python-all.ru/3.9/library/datetime.html#strftime-strptime-behavior).13481349#### `time.__format__(format)`13501351То же, что и [`time.strftime()`](https://python-all.ru/3.9/library/datetime.html#datetime.time.strftime). Это позволяет указать строку формата для объекта [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) в [f-строках](https://python-all.ru/3.9/reference/lexical_analysis.html#f-strings) и при использовании [`str.format()`](https://python-all.ru/3.9/library/stdtypes.html#str.format). Полный список директив форматирования см. [Поведение strftime() и strptime()](https://python-all.ru/3.9/library/datetime.html#strftime-strptime-behavior).13521353#### `time.utcoffset()`13541355Если [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(None)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) с величиной менее одного дня.13561357Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.13581359#### `time.dst()`13601361Если [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.dst(None)`, и возбуждает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) с величиной менее одного дня.13621363Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.13641365#### `time.tzname()`13661367Если [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.tzname(None)`, или возбуждает исключение, если последнее не возвращает `None` или строковый объект.13681369### Примеры использования: [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time)13701371Примеры работы с объектом [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time):13721373```python1374>>> from datetime import time, tzinfo, timedelta1375>>> class TZ1(tzinfo):1376...     def utcoffset(self, dt):1377...         return timedelta(hours=1)1378...     def dst(self, dt):1379...         return timedelta(0)1380...     def tzname(self,dt):1381...         return "+01:00"1382...     def  __repr__(self):1383...         return f"{self.__class__.__name__}()"1384...1385>>> t = time(12, 10, 30, tzinfo=TZ1())1386>>> t1387datetime.time(12, 10, 30, tzinfo=TZ1())1388>>> t.isoformat()1389'12:10:30+01:00'1390>>> t.dst()1391datetime.timedelta(0)1392>>> t.tzname()1393'+01:00'1394>>> t.strftime("%H:%M:%S %Z")1395'12:10:30 +01:00'1396>>> 'The {} is {:%H:%M}.'.format("time", t)1397'The time is 12:10.'1398```13991400## [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) Объекты14011402#### `class datetime.tzinfo`14031404Это абстрактный базовый класс, то есть этот класс не должен создаваться напрямую. Определите подкласс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) для хранения информации о конкретном часовом поясе.14051406Экземпляр (конкретного подкласса) [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) можно передать конструкторам объектов [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time). Последние рассматривают свои атрибуты как местное время, а объект [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) поддерживает методы, показывающие смещение местного времени от UTC, название часового пояса и смещение DST – все относительно переданного им объекта даты или времени.14071408Необходимо создать конкретный подкласс и (как минимум) реализовать стандартные методы [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), необходимые используемым методам [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). Модуль [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) предоставляет [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) – простой конкретный подкласс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), который может представлять часовые пояса с фиксированным смещением от UTC, такие как сам UTC или североамериканские EST и EDT.14091410Особое требование для сериализации: подкласс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) должен иметь метод [`__init__()`](https://python-all.ru/3.9/reference/datamodel.html#object.__init__), который можно вызывать без аргументов, иначе он может быть сериализован, но возможно не десериализован снова. Это техническое требование, которое может быть смягчено в будущем.14111412Конкретному подклассу [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) может потребоваться реализовать следующие методы. Какие именно методы нужны, зависит от того, как используются осведомлённые (aware) объекты [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime). Если есть сомнения, просто реализуйте их все.14131414#### `tzinfo.utcoffset(dt)`14151416Возвращает смещение местного времени от UTC в виде объекта [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta), которое положительно к востоку от UTC. Если местное время к западу от UTC, оно должно быть отрицательным.14171418Это представляет *общее* смещение от UTC; например, если объект [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) представляет как часовой пояс, так и корректировки DST, [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.utcoffset) должен возвращать их сумму. Если смещение UTC неизвестно, верните `None`. В противном случае возвращаемое значение должно быть объектом [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) строго между `-timedelta(hours=24)` и `timedelta(hours=24)` (величина смещения должна быть меньше одного дня). Большинство реализаций [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.utcoffset) будут выглядеть как один из этих двух вариантов:14191420```python1421return CONSTANT                 # класс с фиксированным смещением1422return CONSTANT + self.dst(dt)  # класс, учитывающий летнее время1423```14241425Если [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.utcoffset) не возвращает `None`, то [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.dst) также не должен возвращать `None`.14261427Реализация по умолчанию [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.utcoffset) возбуждает [`NotImplementedError`](https://python-all.ru/3.9/library/exceptions.html#NotImplementedError).14281429Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.14301431#### `tzinfo.dst(dt)`14321433Возвращает поправку на летнее время (DST) в виде объекта [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) или `None`, если информация о DST неизвестна.14341435Возвращает `timedelta(0)`, если DST не действует. Если DST действует, возвращает смещение в виде объекта [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta) (подробнее см. [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.utcoffset)). Обратите внимание, что смещение DST, если применимо, уже добавлено к смещению UTC, возвращаемому [`utcoffset()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.utcoffset), поэтому нет необходимости обращаться к [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.dst), если только вы не хотите получить информацию о DST отдельно. Например, [`datetime.timetuple()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.timetuple) вызывает метод [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.dst) своего атрибута [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzinfo), чтобы определить, как должен быть установлен флаг `tm_isdst`, а [`tzinfo.fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc) вызывает [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.dst) для учёта изменений DST при пересечении часовых поясов.14361437Экземпляр *tz* подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), который моделирует как стандартное, так и летнее время, должен быть согласован в следующем смысле:14381439`tz.utcoffset(dt) - tz.dst(dt)`14401441должен возвращать один и тот же результат для каждого [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) *dt* с `dt.tzinfo == tz` Для здравых подклассов [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) это выражение даёт «стандартное смещение» часового пояса, которое не должно зависеть от даты или времени, а только от географического положения. Реализация [`datetime.astimezone()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.astimezone) полагается на это, но не может обнаружить нарушения; это ответственность программиста. Если подкласс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) не может гарантировать этого, он может переопределить реализацию по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc), чтобы работать корректно с `astimezone()` в любом случае.14421443Большинство реализаций [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.dst), вероятно, будут выглядеть как один из этих двух вариантов:14441445```python1446def dst(self, dt):1447    # класс с фиксированным смещением: не учитывает летнее время1448    return timedelta(0)1449```14501451или:14521453```python1454def dst(self, dt):1455    # Код для установки dston и dstoff в значения летнего времени часового пояса1456    # переходные моменты времени на основе входного dt.year и выраженные1457    # в стандартном местном времени.14581459    if dston <= dt.replace(tzinfo=None) < dstoff:1460        return timedelta(hours=1)1461    else:1462        return timedelta(0)1463```14641465Реализация по умолчанию [`dst()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.dst) вызывает исключение [`NotImplementedError`](https://python-all.ru/3.9/library/exceptions.html#NotImplementedError).14661467Изменено в версии 3.7: Смещение DST не ограничивается целым числом минут.14681469#### `tzinfo.tzname(dt)`14701471Возвращает название часового пояса, соответствующее объекту [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) *dt*, в виде строки. Модуль [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) ничего не определяет относительно строковых названий, и нет требования, чтобы они что-то конкретное означали. Например, «GMT», «UTC», «-500», «-5:00», «EDT», «US/Eastern», «America/New York» – все допустимые ответы. Возвращает `None`, если строковое название неизвестно. Обратите внимание, что это метод, а не фиксированная строка, главным образом потому, что некоторые подклассы [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) захотят возвращать разные названия в зависимости от конкретного значения переданного *dt*, особенно если класс [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) учитывает летнее время.14721473Реализация по умолчанию [`tzname()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.tzname) вызывает исключение [`NotImplementedError`](https://python-all.ru/3.9/library/exceptions.html#NotImplementedError).14741475Эти методы вызываются объектом [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) или [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) в ответ на их одноимённые методы. Объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) передаёт себя в качестве аргумента, а объект [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) передаёт `None`. Поэтому методы подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) должны быть готовы принять аргумент *dt* типа `None` или класса [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime).14761477Когда передаётся `None`, разработчик класса должен решить, какой ответ будет наилучшим. Например, возврат `None` уместен, если класс хочет показать, что объекты времени не участвуют в протоколах [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo). Возможно, более полезным будет, чтобы `utcoffset(None)` возвращал стандартное смещение UTC, так как нет другого соглашения для его определения.14781479Когда объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) передаётся в ответ на вызов метода [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), `dt.tzinfo` является тем же объектом, что и *self*. Методы [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) могут на это полагаться, если только пользовательский код не вызывает методы [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) напрямую. Подразумевается, что методы [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) интерпретируют *dt* как местное время и не должны беспокоиться об объектах в других часовых поясах.14801481Существует ещё один метод [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), который подкласс может переопределить:14821483#### `tzinfo.fromutc(dt)`14841485Этот метод вызывается из реализации по умолчанию [`datetime.astimezone()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.astimezone). При таком вызове `dt.tzinfo` является *self*, а данные даты и времени *dt* рассматриваются как время UTC. Цель [`fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc) – скорректировать данные даты и времени, вернув эквивалентный datetime в местном времени *self*.14861487Большинство подклассов [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) должны без проблем наследовать реализацию по умолчанию [`fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc). Она достаточно сильна, чтобы обрабатывать часовые пояса с фиксированным смещением, а также пояса, учитывающие стандартное и летнее время, причём последние – даже если время перехода на летнее время различается в разные годы. Пример часового пояса, который реализация по умолчанию [`fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc) может обрабатывать неправильно в некоторых случаях, – это пояс, где стандартное смещение (от UTC) зависит от конкретной переданной даты и времени, что может происходить по политическим причинам. Реализации по умолчанию `astimezone()` и [`fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc) могут не дать желаемого результата, если результат приходится на часы, пересекающие момент изменения стандартного смещения.14881489Опуская код для обработки ошибок, реализация по умолчанию [`fromutc()`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo.fromutc) работает следующим образом:14901491```python1492def fromutc(self, dt):1493    # вызывает ошибку ValueError, если dt.tzinfo не равен self1494    dtoff = dt.utcoffset()1495    dtdst = dt.dst()1496    # вызывает ValueError, если dtoff или dtdst равны None1497    delta = dtoff - dtdst  # это стандартное смещение self1498    if delta:1499        dt += delta   # преобразовать в стандартное местное время1500        dtdst = dt.dst()1501        # вызывает ValueError, если dtdst равен None1502    if dtdst:1503        return dt + dtdst1504    else:1505        return dt1506```15071508В следующем файле [`tzinfo_examples.py`](https://python-all.ru/3.9/_downloads/6b45dc135219d1404be49d606589a11d/tzinfo_examples.py) приведены некоторые примеры классов [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo):15091510```python1511from datetime import tzinfo, timedelta, datetime15121513ZERO = timedelta(0)1514HOUR = timedelta(hours=1)1515SECOND = timedelta(seconds=1)15161517# Класс, отражающий представление платформы о местном времени.1518# (Может приводить к неверным значениям для исторических моментов в1519#  часовых поясах, где UTC-смещение и/или правила летнего времени1520#  менялись в прошлом.)1521import time as _time15221523STDOFFSET = timedelta(seconds = -_time.timezone)1524if _time.daylight:1525    DSTOFFSET = timedelta(seconds = -_time.altzone)1526else:1527    DSTOFFSET = STDOFFSET15281529DSTDIFF = DSTOFFSET - STDOFFSET15301531class LocalTimezone(tzinfo):15321533    def fromutc(self, dt):1534        assert dt.tzinfo is self1535        stamp = (dt - datetime(1970, 1, 1, tzinfo=self)) // SECOND1536        args = _time.localtime(stamp)[:6]1537        dst_diff = DSTDIFF // SECOND1538        # Обнаружение fold1539        fold = (args == _time.localtime(stamp - dst_diff))1540        return datetime(*args, microsecond=dt.microsecond,1541                        tzinfo=self, fold=fold)15421543    def utcoffset(self, dt):1544        if self._isdst(dt):1545            return DSTOFFSET1546        else:1547            return STDOFFSET15481549    def dst(self, dt):1550        if self._isdst(dt):1551            return DSTDIFF1552        else:1553            return ZERO15541555    def tzname(self, dt):1556        return _time.tzname[self._isdst(dt)]15571558    def _isdst(self, dt):1559        tt = (dt.year, dt.month, dt.day,1560              dt.hour, dt.minute, dt.second,1561              dt.weekday(), 0, 0)1562        stamp = _time.mktime(tt)1563        tt = _time.localtime(stamp)1564        return tt.tm_isdst > 015651566Local = LocalTimezone()15671568# Полная реализация текущих правил летнего времени для основных часовых поясов США.15691570def first_sunday_on_or_after(dt):1571    days_to_go = 6 - dt.weekday()1572    if days_to_go:1573        dt += timedelta(days_to_go)1574    return dt15751576# Правила летнего времени в США1577#1578# Это упрощённый набор правил для США (т.е. неверный для некоторых случаев)1579# времени начала и окончания летнего времени. Полный и актуальный набор правил летнего времени1580# и определений часовых поясов смотрите в базе данных Olson (или попробуйте pytz):1581# http://www.twinsun.com/tz/tz-link.htm1582# http://sourceforge.net/projects/pytz/ (might not be up-to-date)1583#1584# В США с 2007 года летнее время начинается в 2 часа ночи (стандартное время) во второе1585# воскресенье марта, то есть первое воскресенье 8 марта или после него.1586DSTSTART_2007 = datetime(1, 3, 8, 2)1587# и заканчивается в 2 часа ночи (летнее время) в первое воскресенье ноября.1588DSTEND_2007 = datetime(1, 11, 1, 2)1589# С 1987 по 2006 год летнее время начиналось в 2 часа ночи (стандартное время) в первое1590# воскресенье апреля и заканчивалось в 2 часа ночи (летнее время) в последнее1591# воскресенье октября, то есть первое воскресенье 25 октября или после него.1592DSTSTART_1987_2006 = datetime(1, 4, 1, 2)1593DSTEND_1987_2006 = datetime(1, 10, 25, 2)1594# С 1967 по 1986 год летнее время начиналось в 2 часа ночи (стандартное время) в последнее1595# воскресенье апреля (то есть 24 апреля или после него) и заканчивалось в 2 часа ночи (летнее время)1596# в последнее воскресенье октября, которое является первым воскресеньем1597# 25 октября или позднее.1598DSTSTART_1967_1986 = datetime(1, 4, 24, 2)1599DSTEND_1967_1986 = DSTEND_1987_200616001601def us_dst_range(year):1602    # Найти время начала и окончания перехода на летнее время в США. Для лет до 1967 года вернуть1603    # start = end, если летнее время не применяется.1604    if 2006 < year:1605        dststart, dstend = DSTSTART_2007, DSTEND_20071606    elif 1986 < year < 2007:1607        dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_20061608    elif 1966 < year < 1987:1609        dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_19861610    else:1611        return (datetime(year, 1, 1), ) * 216121613    start = first_sunday_on_or_after(dststart.replace(year=year))1614    end = first_sunday_on_or_after(dstend.replace(year=year))1615    return start, end16161617class USTimeZone(tzinfo):16181619    def __init__(self, hours, reprname, stdname, dstname):1620        self.stdoffset = timedelta(hours=hours)1621        self.reprname = reprname1622        self.stdname = stdname1623        self.dstname = dstname16241625    def __repr__(self):1626        return self.reprname16271628    def tzname(self, dt):1629        if self.dst(dt):1630            return self.dstname1631        else:1632            return self.stdname16331634    def utcoffset(self, dt):1635        return self.stdoffset + self.dst(dt)16361637    def dst(self, dt):1638        if dt is None or dt.tzinfo is None:1639            # В одном или обоих случаях здесь может быть уместно исключение.1640            # Это зависит от того, как вы хотите их обрабатывать. Реализация по умолчанию1641            # fromutc() (вызываемая реализацией astimezone() по умолчанию)1642            # реализация) передаёт datetime с dt.tzinfo равным self.1643            return ZERO1644        assert dt.tzinfo is self1645        start, end = us_dst_range(dt.year)1646        # Нельзя сравнивать наивные и осведомлённые объекты, поэтому сначала удалите часовой пояс из1647        # сначала dt.1648        dt = dt.replace(tzinfo=None)1649        if start + HOUR <= dt < end - HOUR:1650            # Действует летнее время.1651            return HOUR1652        if end - HOUR <= dt < end:1653            # Сложить (неоднозначный час): используйте dt.fold для разрешения неоднозначности.1654            return ZERO if dt.fold else HOUR1655        if start <= dt < start + HOUR:1656            # Gap (несуществующий час): примените обратное правило fold.1657            return HOUR if dt.fold else ZERO1658        # Летнее время не действует.1659        return ZERO16601661    def fromutc(self, dt):1662        assert dt.tzinfo is self1663        start, end = us_dst_range(dt.year)1664        start = start.replace(tzinfo=self)1665        end = end.replace(tzinfo=self)1666        std_time = dt + self.stdoffset1667        dst_time = std_time + HOUR1668        if end <= dst_time < end + HOUR:1669            # Повторяющийся час1670            return std_time.replace(fold=1)1671        if std_time < start or dst_time >= end:1672            # Стандартное время1673            return std_time1674        if start <= std_time < end - HOUR:1675            # Летнее время1676            return dst_time16771678Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")1679Central  = USTimeZone(-6, "Central",  "CST", "CDT")1680Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")1681Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")1682```16831684Обратите внимание, что в подклассе [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), учитывающем как стандартное, так и летнее время, дважды в год в точках перехода на летнее время возникают неизбежные тонкости. Для конкретики рассмотрим восточное время США (UTC -0500), где EDT начинается через минуту после 1:59 (EST) во второе воскресенье марта и заканчивается через минуту после 1:59 (EDT) в первое воскресенье ноября:16851686```python1687  UTC   3:MM  4:MM  5:MM  6:MM  7:MM  8:MM1688  EST  22:MM 23:MM  0:MM  1:MM  2:MM  3:MM1689  EDT  23:MM  0:MM  1:MM  2:MM  3:MM  4:MM16901691start  22:MM 23:MM  0:MM  1:MM  3:MM  4:MM16921693  end  23:MM  0:MM  1:MM  1:MM  2:MM  3:MM1694```16951696Когда начинается летнее время (строка «start»), местные настенные часы перескакивают с 1:59 на 3:00. Местное время вида 2:MM в этот день не имеет смысла, поэтому `astimezone(Eastern)` не вернёт результат с `hour == 2` в день начала DST. Например, при переходе на летнее время весной 2016 года мы получаем:16971698```python1699>>> from datetime import datetime, timezone1700>>> from tzinfo_examples import HOUR, Eastern1701>>> u0 = datetime(2016, 3, 13, 5, tzinfo=timezone.utc)1702>>> for i in range(4):1703...     u = u0 + i*HOUR1704...     t = u.astimezone(Eastern)1705...     print(u.time(), 'UTC =', t.time(), t.tzname())1706...170705:00:00 UTC = 00:00:00 EST170806:00:00 UTC = 01:00:00 EST170907:00:00 UTC = 03:00:00 EDT171008:00:00 UTC = 04:00:00 EDT1711```17121713Когда заканчивается летнее время (строка «end»), возникает потенциально более серьёзная проблема: есть час, который невозможно однозначно выразить в местном настенном времени – последний час летнего времени. В восточном поясе это время вида 5:MM UTC в день окончания летнего времени. Местные настенные часы перескакивают с 1:59 (летнее время) обратно на 1:00 (стандартное время). Местные времена вида 1:MM становятся неоднозначными. `astimezone()` имитирует поведение местных часов, отображая два соседних часа UTC в один и тот же местный час. В примере с восточным поясом времена UTC вида 5:MM и 6:MM оба отображаются в 1:MM при преобразовании в восточное время, но у более ранних времен атрибут [`fold`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fold) установлен в 0, а у более поздних – в 1. Например, при переходе на зимнее время осенью 2016 года мы получаем:17141715```python1716>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)1717>>> for i in range(4):1718...     u = u0 + i*HOUR1719...     t = u.astimezone(Eastern)1720...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)1721...172204:00:00 UTC = 00:00:00 EDT 0172305:00:00 UTC = 01:00:00 EDT 0172406:00:00 UTC = 01:00:00 EST 1172507:00:00 UTC = 02:00:00 EST 01726```17271728Обратите внимание, что экземпляры [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), отличающиеся только значением атрибута [`fold`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fold), считаются равными при сравнении.17291730Приложения, которые не могут мириться с неоднозначностью местного времени, должны явно проверять значение атрибута [`fold`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.fold) или избегать использования гибридных подклассов [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo); неоднозначности отсутствуют при использовании [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) или любого другого подкласса [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo) с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).17311732> **См. также**1733>1734> > **[`zoneinfo`](https://python-all.ru/3.9/library/zoneinfo.html#module-zoneinfo)**1735> >1736> > Модуль [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) содержит базовый класс [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) (для обработки произвольных фиксированных смещений от UTC) и его атрибут [`timezone.utc`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone.utc) (экземпляр часового пояса UTC).1737> >1738> > `zoneinfo` предоставляет *базу данных часовых поясов IANA* (также известную как база данных Олсона) в Python, и её использование рекомендуется.1739>1740> **[база данных часовых поясов IANA](https://python-all.ru/3.9/library/datetime.html)**1741>1742> База данных часовых поясов (часто называемая tz, tzdata или zoneinfo) содержит код и данные, представляющие историю местного времени для множества характерных мест по всему миру. Она периодически обновляется, чтобы отражать изменения, вносимые политическими органами в границы часовых поясов, смещения UTC и правила перехода на летнее время.17431744## [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) Объекты17451746Класс [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone) является подклассом [`tzinfo`](https://python-all.ru/3.9/library/datetime.html#datetime.tzinfo), каждый экземпляр которого представляет часовой пояс, определённый фиксированным смещением от UTC.17471748Объекты этого класса не могут использоваться для представления информации о часовом поясе в местах, где используются разные смещения в разные дни года или где были внесены исторические изменения в гражданское время.17491750#### `class datetime.timezone(offset, name=None)`17511752Аргумент *offset* должен быть задан как объект [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta), представляющий разницу между местным временем и UTC. Он должен находиться строго между `-timedelta(hours=24)` и `timedelta(hours=24)`, в противном случае возникает исключение [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).17531754Аргумент *name* необязателен. Если он указан, это должна быть строка, которая будет использоваться в качестве значения, возвращаемого методом [`datetime.tzname()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.tzname).17551756Новое в версии 3.2.17571758Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.17591760#### `timezone.utcoffset(dt)`17611762Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone).17631764Аргумент *dt* игнорируется. Возвращаемое значение – экземпляр [`timedelta`](https://python-all.ru/3.9/library/datetime.html#datetime.timedelta), равный разнице между местным временем и UTC.17651766Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.17671768#### `timezone.tzname(dt)`17691770Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone).17711772Если *name* не указан в конструкторе, имя, возвращаемое `tzname(dt)`, генерируется из значения `offset` следующим образом. Если *offset* равно `timedelta(0)`, то имя – «UTC», иначе это строка в формате `UTC±HH:MM`, где ± – это знак `offset`, HH и MM – две цифры `offset.hours` и `offset.minutes` соответственно.17731774Изменено в версии 3.6: имя, генерируемое из `offset=timedelta(0)`, теперь просто *‘UTC’*, а не `'UTC+00:00'`.17751776#### `timezone.dst(dt)`17771778Всегда возвращает `None`.17791780#### `timezone.fromutc(dt)`17811782Возвращает `dt + offset`. Аргумент *dt* должен быть осведомлённым экземпляром [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime), с `tzinfo`, установленным в `self`.17831784Атрибуты класса:17851786#### `timezone.utc`17871788Часовой пояс UTC, `timezone(timedelta(0))`.17891790## `strftime()` и `strptime()` Поведение17911792Объекты [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) поддерживают метод `strftime(format)`, который создаёт строку, представляющую время с использованием явной строки формата.17931794И наоборот, метод класса [`datetime.strptime()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.strptime) создаёт объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) из строки, представляющей дату и время, и соответствующей строки формата.17951796Приведённая ниже таблица даёт высокоуровневое сравнение `strftime()` и `strptime()`:17971798|  | `strftime` | `strptime` |1799| --- | --- | --- |1800| Использование | Преобразовать объект в строку по заданному формату | Разбирает строку в объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) по соответствующему формату. |1801| Тип метода | Метод экземпляра | Метод класса |1802| Метод | [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date); [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime); [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) | [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime) |1803| Сигнатура | `strftime(format)` | `strptime(date_string, format)` |18041805### `strftime()` и `strptime()` Коды форматов18061807Ниже приведён список всех кодов формата, требуемых стандартом C 1989 года, и они работают на всех платформах со стандартной реализацией C.18081809| Директива | Значение | Пример | Примечания |1810| --- | --- | --- | --- |1811| `%a` | День недели как сокращённое название в локали. | Вс, Пн, …, Сб (en\_US); So, Mo, …, Sa (de\_DE) | (1) |1812| `%A` | Название дня недели в полной форме, зависящее от локали. | Воскресенье, Понедельник, …, Суббота (en\_US); Sonntag, Montag, …, Samstag (de\_DE) | (1) |1813| `%w` | День недели в виде десятичного числа, где 0 – воскресенье, а 6 – суббота. | 0, 1, …, 6 |  |1814| `%d` | День месяца в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 31 | (9) |1815| `%b` | Название месяца в сокращённой форме, зависящей от локали. | Янв, Фев, …, Дек (en\_US); Jan, Feb, …, Dez (de\_DE) | (1) |1816| `%B` | Название месяца в полной форме, зависящей от локали. | Январь, Февраль, …, Декабрь (en\_US); Januar, Februar, …, Dezember (de\_DE) | (1) |1817| `%m` | Месяц в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 | (9) |1818| `%y` | Год без столетия в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 99 | (9) |1819| `%Y` | Год со столетием в виде десятичного числа. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (2) |1820| `%H` | Часы (в 24-часовом формате) в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 23 | (9) |1821| `%I` | Часы (в 12-часовом формате) в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 | (9) |1822| `%p` | Эквивалент AM или PM, зависящий от локали. | AM, PM (en\_US); am, pm (de\_DE) | (1), (3) |1823| `%M` | Минуты в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 | (9) |1824| `%S` | Секунды в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 | (4), (9) |1825| `%f` | Микросекунды в виде десятичного числа, дополненного слева нулями до 6 цифр. | 000000, 000001, …, 999999 | (5) |1826| `%z` | Смещение UTC в формате `±HHMM[SS[.ffffff]]` (пустая строка, если объект наивный). | (пусто), +0000, -0400, +1030, +063415, -030712.345216 | (6) |1827| `%Z` | Название часового пояса (пустая строка, если объект наивный). | (пусто), UTC, GMT | (6) |1828| `%j` | День года в виде десятичного числа, дополненного слева нулями. | 001, 002, …, 366 | (9) |1829| `%U` | Номер недели в году (воскресенье – первый день недели) в виде десятичного числа, дополненного слева нулями. Все дни в новом году до первого воскресенья считаются неделей 0. | 00, 01, …, 53 | (7), (9) |1830| `%W` | Номер недели в году (понедельник – первый день недели) в виде десятичного числа, дополненного слева нулями. Все дни в новом году до первого понедельника считаются неделей 0. | 00, 01, …, 53 | (7), (9) |1831| `%c` | Представление даты и времени, подходящее для локали. | Вт Авг 16 21:30:00 1988 (en\_US); Di 16 Aug 21:30:00 1988 (de\_DE) | (1) |1832| `%x` | Представление даты, соответствующее локали. | 08/16/88 (None); 08/16/1988 (en\_US); 16.08.1988 (de\_DE) | (1) |1833| `%X` | Представление времени, соответствующее локали. | 21:30:00 (en\_US); 21:30:00 (de\_DE) | (1) |1834| `%%` | Литеральный символ `'%'`. | % |  |18351836Для удобства включено несколько дополнительных директив, не требуемых стандартом C89. Все эти параметры соответствуют значениям дат ISO 8601.18371838| Директива | Значение | Пример | Примечания |1839| --- | --- | --- | --- |1840| `%G` | Год по ISO 8601 с веком, представляющий год, который содержит большую часть недели по ISO 8601 (`%V`). | 0001, 0002, …, 2013, 2014, …, 9998, 9999 | (8) |1841| `%u` | День недели по ISO 8601 в виде десятичного числа, где 1 – понедельник. | 1, 2, …, 7 |  |1842| `%V` | Неделя по ISO 8601 в виде десятичного числа, где понедельник считается первым днём недели. Неделя 01 – это неделя, содержащая 4 января. | 01, 02, …, 53 | (8), (9) |18431844Они могут быть доступны не на всех платформах при использовании с методом `strftime()`. Директивы года по ISO 8601 и недели по ISO 8601 не взаимозаменяемы с указанными выше директивами года и номера недели. Вызов `strptime()` с неполными или неоднозначными директивами ISO 8601 приведёт к возникновению [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).18451846Полный набор поддерживаемых кодов формата зависит от платформы, поскольку Python вызывает функцию `strftime()` из библиотеки C платформы, а различия между платформами распространены. Чтобы увидеть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации *[strftime(3)](https://python-all.ru/3.9/library/datetime.html)*. Также существуют различия между платформами в обработке неподдерживаемых спецификаторов формата.18471848Новое в версии 3.6: `%G`, `%u` и `%V` были добавлены.18491850### Технические детали18511852В целом, `d.strftime(fmt)` действует как [`time`](https://python-all.ru/3.9/library/time.html#module-time) из модуля `time.strftime(fmt, d.timetuple())`, хотя не все объекты поддерживают метод `timetuple()`.18531854Для метода класса [`datetime.strptime()`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime.strptime) значением по умолчанию является `1900-01-01T00:00:00.000`: все компоненты, не указанные в строке формата, будут взяты из значения по умолчанию. [4](https://python-all.ru/3.9/library/datetime.html#id8)18551856Использование `datetime.strptime(date_string, format)` эквивалентно:18571858```python1859datetime(*(time.strptime(date_string, format)[0:6]))1860```18611862за исключением случаев, когда формат включает субсекундные компоненты или смещение часового пояса, которые поддерживаются в `datetime.strptime`, но отбрасываются `time.strptime`.18631864Для объектов [`time`](https://python-all.ru/3.9/library/datetime.html#datetime.time) коды формата для года, месяца и дня не должны использоваться, поскольку объекты [`time`](https://python-all.ru/3.9/library/time.html#module-time) не имеют таких значений. Если они всё же используются, `1900` подставляется для года, а `1` для месяца и дня.18651866Для объектов [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) коды формата для часов, минут, секунд и микросекунд не должны использоваться, поскольку объекты [`date`](https://python-all.ru/3.9/library/datetime.html#datetime.date) не имеют таких значений. Если они всё же используются, вместо них подставляется `0`.18671868По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются в выходных данных без изменений, в то время как на других `strftime` может вызвать [`UnicodeError`](https://python-all.ru/3.9/library/exceptions.html#UnicodeError) или вернуть пустую строку.18691870Примечания:187118721. Поскольку формат зависит от текущей локали, следует проявлять осторожность при выводах о возвращаемом значении. Порядок полей может различаться (например, “месяц/день/год” вместо “день/месяц/год”), а результат может содержать символы Unicode, закодированные с помощью кодировки локали по умолчанию (например, если текущая локаль – `ja_JP`, кодировкой по умолчанию может быть любая из `eucJP`, `SJIS` или `utf-8`; используйте [`locale.getlocale()`](https://python-all.ru/3.9/library/locale.html#locale.getlocale), чтобы определить кодировку текущей локали).18732. Метод `strptime()` может разбирать годы в полном диапазоне \[1, 9999\], но годы \< 1000 должны быть дополнены нулями до 4-значной ширины.18741875   Изменено в версии 3.2: В предыдущих версиях метод `strftime()` был ограничен gодами \>= 1900.18761877   Изменено в версии 3.3: В версии 3.2 метод `strftime()` был ограничен gодами \>= 1000.18783. При использовании с методом `strptime()` директива `%p` влияет только на поле вывода часа, если директива `%I` используется для разбора часа.18794. В отличие от модуля [`time`](https://python-all.ru/3.9/library/time.html#module-time), модуль [`datetime`](https://python-all.ru/3.9/library/datetime.html#module-datetime) не поддерживает високосные секунды.18805. При использовании с методом `strptime()` директива `%f` принимает от одной до шести цифр и дополняет нулями справа. `%f` является расширением набора символов форматирования в стандарте C (но реализован отдельно в объектах datetime, поэтому всегда доступен).18816. Для наивного объекта коды формата `%z` и `%Z` заменяются пустыми строками.18821883   Для осведомлённого объекта:18841885   **`%z`**18861887   `utcoffset()` преобразуется в строку вида `±HHMM[SS[.ffffff]]`, где `HH` – двухсимвольная строка, задающая количество часов смещения UTC, `MM` – двухсимвольная строка, задающая количество минут смещения UTC, `SS` – двухсимвольная строка, задающая количество секунд смещения UTC, а `ffffff` – шестисимвольная строка, задающая количество микросекунд смещения UTC. Часть `ffffff` опускается, если смещение составляет целое число секунд, а части `ffffff` и `SS` опускаются, если смещение составляет целое число минут. Например, если `utcoffset()` возвращает `timedelta(hours=-3, minutes=-30)`, то `%z` заменяется строкой `'-0330'`.18881889   Изменено в версии 3.7: Смещение UTC теперь не ограничено целым числом минут.18901891   Изменено в версии 3.7: Когда директива `%z` передаётся методу `strptime()`, смещения UTC могут содержать двоеточие в качестве разделителя между часами, минутами и секундами. Например, `'+01:00:00'` будет разобрано как смещение в один час. Кроме того, указание `'Z'` эквивалентно `'+00:00'`.18921893   **`%Z`**18941895   В `strftime()` `%Z` заменяется пустой строкой, если `tzname()` возвращает `None`; в противном случае `%Z` заменяется возвращённым значением, которое должно быть строкой.18961897   `strptime()` принимает только определённые значения для `%Z`:18981899   1. любое значение из `time.tzname` для локали вашей системы1900   2. жёстко заданные значения `UTC` и `GMT`19011902   Так, человек, живущий в Японии, может иметь `JST`, `UTC` и `GMT` в качестве допустимых значений, но, вероятно, не `EST`. Для недопустимых значений будет возбуждено `ValueError`.19031904   Изменено в версии 3.2: Когда директива `%z` передаётся методу `strptime()`, будет создан осведомлённый объект [`datetime`](https://python-all.ru/3.9/library/datetime.html#datetime.datetime). Атрибут `tzinfo` результата будет установлен в экземпляр [`timezone`](https://python-all.ru/3.9/library/datetime.html#datetime.timezone).19057. При использовании с методом `strptime()` `%U` и `%W` используются только в вычислениях, когда указаны день недели и календарный год (`%Y`).19068. Аналогично `%U` и `%W`, `%V` используется только в вычислениях, когда день недели и год по ISO (`%G`) указаны в строке форматирования `strptime()`. Также обратите внимание, что `%G` и `%Y` не являются взаимозаменяемыми.19079. При использовании с методом `strptime()` ведущий ноль является необязательным для форматов `%d`, `%m`, `%H`, `%I`, `%M`, `%S`, `%J`, `%U`, `%W` и `%V`. Формат `%y` требует ведущего нуля.19081909Сноски19101911**[1](https://python-all.ru/3.9/library/datetime.html#id1)**19121913Если, конечно, не учитывать эффекты теории относительности19141915**[2](https://python-all.ru/3.9/library/datetime.html#id2)**19161917Это соответствует определению пролептического григорианского календаря в книге Дершовица и Рейнгольда *Calendrical Calculations*, где он является базовым календарём для всех вычислений. Смотрите книгу для алгоритмов преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами.19181919**[3](https://python-all.ru/3.9/library/datetime.html#id3)**19201921Смотрите [руководство по математике календаря ISO 8601](https://python-all.ru/3.9/library/datetime.html) Р. Х. ван Гента для хорошего объяснения.19221923**[4](https://python-all.ru/3.9/library/datetime.html#id4)**19241925Передача `datetime.strptime('Feb 29', '%b %d')` завершится ошибкой, поскольку `1900` не является високосным годом.1926