datetime.md
1> **Источник:** https://python-all.ru/3.0/library/datetime.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `datetime` – основные типы даты и времени89Модуль `datetime` предоставляет классы для работы с датами и временем как в простых, так и в сложных сценариях. Поддерживается арифметика дат и времени, но основное внимание в реализации уделяется эффективному извлечению отдельных компонентов для форматирования вывода и преобразований. Дополнительные возможности см. также в модулях [`time`](https://python-all.ru/3.0/library/time.html#module-time) и [`calendar`](https://python-all.ru/3.0/library/calendar.html#module-calendar).1011Существует два типа объектов даты и времени: «наивные» и «осведомлённые». Это различие указывает на то, учитывает ли объект часовой пояс, переход на летнее время или другие алгоритмические или политические корректировки времени. Представляет ли наивный объект [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) всемирное координированное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит исключительно от программы – точно так же, как от программы зависит, обозначает ли конкретное число метры, мили или массу. Наивные объекты [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) просты для понимания и работы, но ценой игнорирования некоторых аспектов реальности.1213Для приложений, которым требуется больше возможностей, объекты [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) содержат необязательный атрибут информации о часовом поясе [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), который может содержать экземпляр подкласса абстрактного класса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo). Эти объекты [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) содержат информацию о смещении от UTC, названии часового пояса и о том, действует ли переход на летнее время. Обратите внимание, что модуль `datetime` не предоставляет конкретных реализаций класса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo). Поддержка часовых поясов с требуемым уровнем детализации возлагается на приложение. Правила корректировки времени по всему миру скорее политические, чем рациональные, и не существует стандарта, подходящего для всех приложений.1415Модуль `datetime` предоставляет следующие константы:1617#### `[datetime.MINYEAR]datetime.MINYEAR`1819Наименьший номер года, допустимый в объекте2021[`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date)2223или2425[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)2627.2829[`MINYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MINYEAR)3031равен3233`1`3435.3637#### `[datetime.MAXYEAR]datetime.MAXYEAR`3839Наибольший номер года, допустимый в объекте4041[`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date)4243или4445[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)4647.4849[`MAXYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MAXYEAR)5051равен5253`9999`5455.5657> **См. также**58>59> **Модуль [`calendar`](https://python-all.ru/3.0/library/calendar.html#module-calendar)**60>61> Общие функции, связанные с календарём.62>63> **Модуль [`time`](https://python-all.ru/3.0/library/time.html#module-time)**64>65> Доступ к времени и преобразования.6667## Доступные типы6869#### `[datetime.date]class datetime.date`7071Идеализированная наивная дата, подразумевающая, что действует текущий григорианский календарь, как действовал всегда и будет действовать всегда. Атрибуты:7273[`year`](https://python-all.ru/3.0/library/datetime.html#datetime.date.year)7475,7677[`month`](https://python-all.ru/3.0/library/datetime.html#datetime.date.month)7879и8081[`day`](https://python-all.ru/3.0/library/datetime.html#datetime.date.day)8283.8485#### `[datetime.time]class datetime.time`8687Идеализированное время, не зависящее от какого-либо конкретного дня, подразумевающее, что каждый день состоит ровно из 24\*60\*60 секунд (понятие «високосных секунд» здесь отсутствует). Атрибуты:8889[`hour`](https://python-all.ru/3.0/library/datetime.html#datetime.time.hour)9091,9293[`minute`](https://python-all.ru/3.0/library/datetime.html#datetime.time.minute)9495,9697[`second`](https://python-all.ru/3.0/library/datetime.html#datetime.time.second)9899,100101[`microsecond`](https://python-all.ru/3.0/library/datetime.html#datetime.time.microsecond)102103и104105[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)106107.108109#### `[datetime.datetime]class datetime.datetime`110111Комбинация даты и времени. Атрибуты:112113[`year`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.year)114115,116117[`month`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.month)118119,120121[`day`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.day)122123,124125[`hour`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.hour)126127,128129[`minute`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.minute)130131,132133[`second`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.second)134135,136137[`microsecond`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.microsecond)138139и140141[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)142143.144145#### `[datetime.timedelta]class datetime.timedelta`146147Продолжительность, выражающая разницу между двумя экземплярами148149[`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date)150151,152153[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)154155или156157[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)158159с точностью до микросекунды.160161#### `[datetime.tzinfo]class datetime.tzinfo`162163Абстрактный базовый класс для объектов информации о часовом поясе. Они используются классами164165[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)166167и168169[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)170171для обеспечения настраиваемой концепции корректировки времени (например, для учёта часового пояса и/или летнего времени).172173Объекты этих типов неизменяемы.174175Объекты типа [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) всегда наивны.176177Объект *d* типа [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) может быть наивным или осведомлённым. *d* является осведомлённым, если `d.tzinfo` не равно `None` и `d.tzinfo.utcoffset(d)` не возвращает `None`. Если `d.tzinfo` равно `None`, или если `d.tzinfo` не равно `None`, но `d.tzinfo.utcoffset(d)` возвращает `None`, то *d* является наивным.178179Различие между наивными и осведомлёнными объектами не применимо к объектам [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta).180181Отношения подклассов:182183```python184object185 timedelta186 tzinfo187 time188 date189 datetime190```191192## [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) объекты193194Объект [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) представляет продолжительность, разницу между двумя датами или моментами времени.195196#### `class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])`197198Все аргументы необязательны и по умолчанию равны `0`. Аргументы могут быть целыми числами или числами с плавающей запятой, положительными или отрицательными.199200Внутри хранятся только *days*, *seconds* и *microseconds*. Аргументы преобразуются в эти единицы:201202- Миллисекунда преобразуется в 1000 микросекунд.203- Минута преобразуется в 60 секунд.204- Час преобразуется в 3600 секунд.205- Неделя преобразуется в 7 дней.206207а затем дни, секунды и микросекунды нормализуются так, что представление уникально, с208209- `0 <= микросекунды < 1000000`210- `0 <= секунды < 3600*24` (количество секунд в одном дне)211- `-999999999 <= дни <= 999999999`212213Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, дробные микросекунды, оставшиеся от всех аргументов, объединяются и их сумма округляется до ближайшей микросекунды. Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).214215Если нормализованное значение дней выходит за указанный диапазон, возбуждается исключение [`OverflowError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OverflowError).216217Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например,218219```python220>>> from datetime import timedelta221>>> d = timedelta(microseconds=-1)222>>> (d.days, d.seconds, d.microseconds)223(-1, 86399, 999999)224```225226Атрибуты класса:227228#### `[datetime.timedelta.min]timedelta.min`229230Наиболее отрицательный объект231232[`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)233234,235236`timedelta(-999999999)`237238.239240#### `[datetime.timedelta.max]timedelta.max`241242Наиболее положительный объект243244[`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)245246,247248`timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)`249250.251252#### `[datetime.timedelta.resolution]timedelta.resolution`253254Наименьшая возможная разница между неравными объектами255256[`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)257258,259260`timedelta(microseconds=1)`261262.263264Обратите внимание, что из-за нормализации `timedelta.max` \> `-timedelta.min`. `-timedelta.max` не представим в виде объекта [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta).265266Атрибуты экземпляра (только для чтения):267268| Атрибут | Значение |269| --- | --- |270| `days` | От -999999999 до 999999999 включительно |271| `seconds` | От 0 до 86399 включительно |272| `microseconds` | От 0 до 999999 включительно |273274Поддерживаемые операции:275276| Операция | Результат |277| --- | --- |278| `t1 = t2 + t3` | Сумма *t2* и *t3*. После этого *t1*-*t2* == *t3* и *t1*-*t3* == *t2* истинны. (1) |279| `t1 = t2 - t3` | Разность *t2* и *t3*. После этого *t1* == *t2* - *t3* и *t2* == *t1* + *t3* истинны. (1) |280| `t1 = t2 * i или t1 = i * t2` | Дельта, умноженная на целое число. После этого *t1* // i == *t2* истинно, при условии `i != 0`. |281| | В общем случае, *t1* \* i == *t1* \* (i-1) + *t1* является истинным. (1) |282| `t1 = t2 // i` | Вычисляется целая часть от деления, а остаток (если есть) отбрасывается. (3) |283| `+t1` | Возвращает объект [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) с тем же значением. (2) |284| `-t1` | эквивалентно [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)(-*t1.days*, -*t1.seconds*, -*t1.microseconds*), и *t1*\* -1. (1)(4) |285| `abs(t)` | эквивалентно +\*t\*, когда `t.days >= 0`, и -*t*, когда `t.days < 0`. (2) |286287Примечания:2882891. Это точное вычисление, но может произойти переполнение.2902. Это точное вычисление и не может вызвать переполнение.2913. Деление на 0 вызывает [`ZeroDivisionError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ZeroDivisionError).2924. *timedelta.max* не представим как объект [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta).293294Помимо перечисленных выше операций, объекты [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) поддерживают определённые сложения и вычитания с объектами [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) и [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) (см. ниже).295296Сравнения объектов [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) поддерживаются: объект [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) с меньшей продолжительностью считается меньшим timedelta. Чтобы сравнения смешанных типов не использовали сравнение по умолчанию по адресу объекта, при сравнении объекта [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), если только сравнение не является `==` или `!=`. Последние случаи возвращают соответственно [`False`](https://python-all.ru/3.0/library/constants.html#False) или [`True`](https://python-all.ru/3.0/library/constants.html#True).297298Объекты [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) являются [*хэшируемыми*](https://python-all.ru/3.0/glossary.html#term-hashable) (могут использоваться в качестве ключей словаря), поддерживают эффективную сериализацию и в логическом контексте объект [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) считается истинным тогда и только тогда, когда он не равен `timedelta(0)`.299300Пример использования:301302```python303>>> from datetime import timedelta304>>> year = timedelta(days=365)305>>> another_year = timedelta(weeks=40, days=84, hours=23,306... minutes=50, seconds=600) # составляет 365 дней307>>> year == another_year308True309>>> ten_years = 10 * year310>>> ten_years, ten_years.days // 365311(datetime.timedelta(3650), 10)312>>> nine_years = ten_years - year313>>> nine_years, nine_years.days // 365314(datetime.timedelta(3285), 9)315>>> three_years = nine_years // 3;316>>> three_years, three_years.days // 365317(datetime.timedelta(1095), 3)318>>> abs(three_years - ten_years) == 2 * three_years + year319True320```321322## [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) объекты323324Объект [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) представляет дату (год, месяц и день) в идеализированном календаре – текущем григорианском календаре, бесконечно продолженном в обоих направлениях. 1 января 1 года называется днём номер 1, 2 января 1 года называется днём номер 2 и так далее. Это соответствует определению «пролептического григорианского» календаря в книге Дершовица и Рейнгольда «Calendrical Calculations», где он является базовым календарём для всех вычислений. За алгоритмами преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами обращайтесь к этой книге.325326#### `class datetime.date(year, month, day)`327328Все аргументы обязательны. Аргументы могут быть целыми числами в следующих диапазонах:329330- `MINYEAR <= year <= MAXYEAR`331- `1 <= month <= 12`332- `1 <= day <= количество дней в указанном month и year`333334Если задан аргумент вне этих диапазонов, возникает исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError).335336Другие конструкторы – все методы класса:337338#### `[datetime.date.today]date.today()`339340Возвращает текущую локальную дату. Это эквивалентно341342`date.fromtimestamp(time.time())`343344.345346#### `[datetime.date.fromtimestamp]date.fromtimestamp(timestamp)`347348Возвращает локальную дату, соответствующую POSIX-метке времени, например, возвращаемой функцией349350[`time.time()`](https://python-all.ru/3.0/library/time.html#time.time)351352. Может вызывать353354[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)355356, если метка времени выходит за пределы значений, поддерживаемых платформенной функцией C357358`localtime`359360. Обычно это ограничивает диапазон лет с 1970 по 2038. Обратите внимание, что в системах, не совместимых с POSIX, которые включают високосные секунды в представление метки времени, високосные секунды игнорируются функцией361362[`fromtimestamp()`](https://python-all.ru/3.0/library/datetime.html#datetime.date.fromtimestamp)363364.365366#### `[datetime.date.fromordinal]date.fromordinal(ordinal)`367368Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1.369370[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)371372возбуждается, если373374`1 <= ordinal <= date.max.toordinal()`375376не выполнено. Для любой даты377378*d*379380,381382`date.fromordinal(d.toordinal()) == d`383384.385386Атрибуты класса:387388#### `[datetime.date.min]date.min`389390Самая ранняя представимая дата,391392`date(MINYEAR, 1, 1)`393394.395396#### `[datetime.date.max]date.max`397398Самая поздняя представимая дата,399400`date(MAXYEAR, 12, 31)`401402.403404#### `[datetime.date.resolution]date.resolution`405406Наименьшая возможная разница между неравными объектами даты,407408`timedelta(days=1)`409410.411412Атрибуты экземпляра (только для чтения):413414#### `[datetime.date.year]date.year`415416Between417418[`MINYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MINYEAR)419420and421422[`MAXYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MAXYEAR)423424inclusive.425426#### `[datetime.date.month]date.month`427428От 1 до 12 включительно.429430#### `[datetime.date.day]date.day`431432От 1 до количества дней в указанном месяце указанного года.433434Поддерживаемые операции:435436| Операция | Результат |437| --- | --- |438| `date2 = date1 + timedelta` | *date2* отстоит от *date1* на `timedelta.days` дней . (1) |439| `date2 = date1 - timedelta` | Вычисляет *date2* так, что `date2 + timedelta == date1`. (2) |440| `timedelta = date1 - date2` | (3) |441| `date1 < date2` | *date1* считается меньше *date2*, если *date1* предшествует *date2* во времени. (4) |442443Примечания:4444451. *date2* смещается вперёд во времени, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. После этого `date2 - date1 == timedelta.days`. `timedelta.seconds` и `timedelta.microseconds` игнорируются. [`OverflowError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OverflowError) возбуждается, если `date2.year` окажется меньше [`MINYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MAXYEAR).4462. Это не совсем эквивалентно date1 + (-timedelta), поскольку -timedelta сам по себе может вызвать переполнение в случаях, когда date1 - timedelta не вызывает. `timedelta.seconds` и `timedelta.microseconds` игнорируются.4473. Это точная операция и не может вызвать переполнение. timedelta.seconds и timedelta.microseconds равны 0, и после этого date2 + timedelta == date1.4484. Другими словами, `date1 < date2` тогда и только тогда, когда `date1.toordinal() < date2.toordinal()`. Чтобы сравнение не откатывалось к стандартной схеме сравнения адресов объектов, сравнение дат обычно возбуждает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), если другой операнд не является объектом [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date). Однако вместо этого возвращается `NotImplemented`, если другой операнд имеет атрибут `timetuple()`. Этот перехват даёт другим видам объектов даты возможность реализовать смешанное сравнение. Если нет, то при сравнении объекта [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращаются соответственно [`False`](https://python-all.ru/3.0/library/constants.html#False) или [`True`](https://python-all.ru/3.0/library/constants.html#True).449450Даты могут использоваться в качестве ключей словаря. В логическом контексте все объекты [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) считаются истинными.451452Методы экземпляра:453454#### `[datetime.date.replace]date.replace(year, month, day)`455456Возвращает дату с тем же значением, за исключением тех членов, которым заданы новые значения с помощью указанных именованных аргументов. Например, если457458`d == date(2002, 12, 31)`459460, то461462`d.replace(day=26) == date(2002, 12, 26)`463464.465466#### `[datetime.date.timetuple]date.timetuple()`467468Возвращает469470[`time.struct_time`](https://python-all.ru/3.0/library/time.html#time.struct_time)471472, аналогичный возвращаемому функцией473474[`time.localtime()`](https://python-all.ru/3.0/library/time.html#time.localtime)475476. Часы, минуты и секунды равны 0, а флаг DST равен -1.477478`d.timetuple()`479480эквивалентен481482`time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), d.toordinal() - date(d.year, 1, 1).toordinal() + 1, -1))`483484#### `[datetime.date.toordinal]date.toordinal()`485486Возвращает пролептический григорианский порядковый номер даты, где 1 января 1 года имеет порядковый номер 1. Для любого объекта487488[`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date)489490*d*491492,493494`date.fromordinal(d.toordinal()) == d`495496.497498#### `[datetime.date.weekday]date.weekday()`499500Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. Например,501502`date(2002, 12, 4).weekday() == 2`503504– это среда. См. также505506[`isoweekday()`](https://python-all.ru/3.0/library/datetime.html#datetime.date.isoweekday)507508.509510#### `[datetime.date.isoweekday]date.isoweekday()`511512Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. Например,513514`date(2002, 12, 4).isoweekday() == 3`515516– это среда. См. также517518[`weekday()`](https://python-all.ru/3.0/library/datetime.html#datetime.date.weekday)519520,521522[`isocalendar()`](https://python-all.ru/3.0/library/datetime.html#datetime.date.isocalendar)523524.525526#### `[datetime.date.isocalendar]date.isocalendar()`527528Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO).529530ISO-календарь – широко используемый вариант григорианского календаря. Смотрите [http://www.phys.uu.nl/](https://python-all.ru/3.0/library/datetime.html) vgent/calendar/isocalendar.htm для подробного объяснения.531532ISO-год состоит из 52 или 53 полных недель, при этом неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя ISO-года – это первая (григорианская) календарная неделя года, в которую входит четверг. Она называется неделей номер 1, и ISO-год этого четверга совпадает с его григорианским годом.533534Например, 2004 год начинается в четверг, поэтому первая неделя ISO-года 2004 начинается в понедельник, 29 декабря 2003 г., и заканчивается в воскресенье, 4 января 2004 г., так что `date(2003, 12, 29).isocalendar() == (2004, 1, 1)` и `date(2004, 1, 4).isocalendar() == (2004, 1, 7)`.535536#### `[datetime.date.isoformat]date.isoformat()`537538Возвращает строку, представляющую дату в формате ISO 8601, ‘YYYY-MM-DD’. Например,539540`date(2002, 12, 4).isoformat() == '2002-12-04'`541542.543544#### `[datetime.date.__str__]date.__str__()`545546Для даты547548*d*549550,551552`str(d)`553554эквивалентно555556`d.isoformat()`557558.559560#### `[datetime.date.ctime]date.ctime()`561562Возвращает строку, представляющую дату, например563564`date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'`565566.567568`d.ctime()`569570эквивалентно571572`time.ctime(time.mktime(d.timetuple()))`573574на платформах, где нативная C-функция575576`ctime`577578(которую вызывает579580[`time.ctime()`](https://python-all.ru/3.0/library/time.html#time.ctime)581582, но которую583584[`date.ctime()`](https://python-all.ru/3.0/library/datetime.html#datetime.date.ctime)585586не вызывает) соответствует стандарту C.587588#### `[datetime.date.strftime]date.strftime(format)`589590Возвращает строку, представляющую дату, управляемую явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. Смотрите раздел591592[*strftime() Behavior*](https://python-all.ru/3.0/library/datetime.html#strftime-behavior)593594.595596Пример подсчёта дней до события:597598```python599>>> import time600>>> from datetime import date601>>> today = date.today()602>>> today603datetime.date(2007, 12, 5)604>>> today == date.fromtimestamp(time.time())605True606>>> my_birthday = date(today.year, 6, 24)607>>> if my_birthday < today:608... my_birthday = my_birthday.replace(year=today.year + 1)609>>> my_birthday610datetime.date(2008, 6, 24)611>>> time_to_birthday = abs(my_birthday - today)612>>> time_to_birthday.days613202614```615616Пример работы с [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date):617618```python619>>> from datetime import date620>>> d = date.fromordinal(730920) # 730920-й день после 1.1.0001621>>> d622datetime.date(2002, 3, 11)623>>> t = d.timetuple()624>>> for i in t: 625... print(i)6262002 # year6273 # month62811 # day6290630063106320 # weekday (0 = Monday)63370 # 70th day in the year634-1635>>> ic = d.isocalendar()636>>> for i in ic: 637... print(i)6382002 # ISO year63911 # ISO week number6401 # ISO day number ( 1 = Monday )641>>> d.isoformat()642'2002-03-11'643>>> d.strftime("%d/%m/%y")644'11/03/02'645>>> d.strftime("%A %d. %B %Y")646'Monday 11. March 2002'647```648649## [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) Объекты650651Объект [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) – это единый объект, содержащий всю информацию из объекта [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) и объекта [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time). Как и объект [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) предполагает использование текущего григорианского календаря, расширенного в обоих направлениях; как и объект time, [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) предполагает, что в каждом дне ровно 3600\*24 секунд.652653Конструктор:654655#### `class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])`656657Аргументы year, month и day являются обязательными. *tzinfo* может быть `None`, или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами, в следующих диапазонах:658659- `MINYEAR <= year <= MAXYEAR`660- `1 <= month <= 12`661- `1 <= day <= количество дней в указанном month и year`662- `0 <= hour < 24`663- `0 <= minute < 60`664- `0 <= секунда < 60`665- `0 <= microsecond < 1000000`666667Если задан аргумент вне этих диапазонов, возникает исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError).668669Другие конструкторы – все методы класса:670671#### `[datetime.datetime.today]datetime.today()`672673Возвращает текущее локальное datetime с674675[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)676677, равным678679`None`680681. Это эквивалентно682683`datetime.fromtimestamp(time.time())`684685. См. также686687[`now()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.now)688689,690691[`fromtimestamp()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.fromtimestamp)692693.694695#### `[datetime.datetime.now]datetime.now([tz])`696697Возвращает текущие локальные дату и время. Если необязательный аргумент *tz* равен `None` или не указан, то результат аналогичен [`today()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.today), но, если возможно, обеспечивает более высокую точность, чем при получении через метку времени [`time.time()`](https://python-all.ru/3.0/library/time.html#time.time) (например, это возможно на платформах, поддерживающих C-функцию `gettimeofday`).698699В противном случае *tz* должен быть экземпляром подкласса класса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), и текущие дата и время преобразуются в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcnow().replace(tzinfo=tz))`. См. также [`today()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.today), [`utcnow()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.utcnow).700701#### `[datetime.datetime.utcnow]datetime.utcnow()`702703Возвращает текущие дату и время в UTC, с704705[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)706707`None`708709. Это подобно710711[`now()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.now)712713, но возвращает текущие дату и время в UTC в виде наивного714715[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)716717объекта. См. также718719[`now()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.now)720721.722723#### `[datetime.datetime.fromtimestamp]datetime.fromtimestamp(timestamp[, tz])`724725Возвращает локальные дату и время, соответствующие POSIX-временной метке, такой как возвращается функцией [`time.time()`](https://python-all.ru/3.0/library/time.html#time.time). Если необязательный аргумент *tz* равен `None` или не указан, временная метка преобразуется в локальные дату и время платформы, и возвращаемый объект [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) является наивным.726727В противном случае *tz* должен быть экземпляром подкласса класса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), и временная метка преобразуется в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))`.728729[`fromtimestamp()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.fromtimestamp) может вызвать [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемых функциями C `localtime` или `gmtime`. Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в не-POSIX системах, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются [`fromtimestamp()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.fromtimestamp), и поэтому возможно наличие двух меток времени, различающихся на секунду, которые дают одинаковые объекты [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime). См. также [`utcfromtimestamp()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.utcfromtimestamp).730731#### `[datetime.datetime.utcfromtimestamp]datetime.utcfromtimestamp(timestamp)`732733Возвращает UTC734735[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)736737, соответствующий POSIX-метке времени, с738739[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)740741`None`742743. Это может вызвать744745[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)746747, если метка времени выходит за пределы диапазона значений, поддерживаемого функцией C748749`gmtime`750751. Обычно это ограничивается годами с 1970 по 2038. См. также752753[`fromtimestamp()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.fromtimestamp)754755.756757#### `[datetime.datetime.fromordinal]datetime.fromordinal(ordinal)`758759Возвращает объект760761[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)762763, соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1.764765[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)766767возбуждается, если768769`1 <= ordinal <= datetime.max.toordinal()`770771. Часы, минуты, секунды и микросекунды результата равны 0, а772773[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)774775равно776777`None`778779.780781#### `[datetime.datetime.combine]datetime.combine(date, time)`782783Возвращает новый объект784785[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)786787, чьи члены даты равны соответствующим членам заданного объекта788789[`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date)790791, а члены времени и792793[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)794795равны членам заданного объекта796797[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)798799. Для любого объекта800801[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)802803*d*804805,806807`d == datetime.combine(d.date(), d.timetz())`808809. Если date является объектом810811[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)812813, его члены времени и814815[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)816817игнорируются.818819#### `[datetime.datetime.strptime]datetime.strptime(date_string, format)`820821Return a822823[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)824825corresponding to826827*date\_string*828829, parsed according to830831*format*832833. This is equivalent to834835`datetime(*(time.strptime(date_string, format)[0:6]))`836837.838839[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)840841is raised if the date\_string and format can’t be parsed by842843[`time.strptime()`](https://python-all.ru/3.0/library/time.html#time.strptime)844845or if it returns a value which isn’t a time tuple.846847Атрибуты класса:848849#### `[datetime.datetime.min]datetime.min`850851Самый ранний представимый объект852853[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)854855:856857`datetime(MINYEAR, 1, 1, tzinfo=None)`858859.860861#### `[datetime.datetime.max]datetime.max`862863Самый поздний представимый объект864865[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)866867:868869`datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)`870871.872873#### `[datetime.datetime.resolution]datetime.resolution`874875Наименьшая возможная разница между неравными объектами876877[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)878879:880881`timedelta(microseconds=1)`882883.884885Атрибуты экземпляра (только для чтения):886887#### `[datetime.datetime.year]datetime.year`888889Between890891[`MINYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MINYEAR)892893and894895[`MAXYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MAXYEAR)896897inclusive.898899#### `[datetime.datetime.month]datetime.month`900901От 1 до 12 включительно.902903#### `[datetime.datetime.day]datetime.day`904905От 1 до количества дней в указанном месяце указанного года.906907#### `[datetime.datetime.hour]datetime.hour`908909В диапазоне910911`range(24)`912913.914915#### `[datetime.datetime.minute]datetime.minute`916917В диапазоне918919`range(60)`920921.922923#### `[datetime.datetime.second]datetime.second`924925В диапазоне926927`range(60)`928929.930931#### `[datetime.datetime.microsecond]datetime.microsecond`932933В диапазоне934935`range(1000000)`936937.938939#### `[datetime.datetime.tzinfo]datetime.tzinfo`940941Объект, переданный в качестве аргумента942943*tzinfo*944945конструктору946947[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)948949, или950951`None`952953, если ничего не передано.954955Поддерживаемые операции:956957| Операция | Результат |958| --- | --- |959| `datetime2 = datetime1 + timedelta` | (1) |960| `datetime2 = datetime1 - timedelta` | (2) |961| `timedelta = datetime1 - datetime2` | (3) |962| `datetime1 < datetime2` | Сравнивает [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) с [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime). (4) |9639641. datetime2 – это datetime1, из которого вычтен timedelta. Если `timedelta.days` \> 0, результат сдвигается вперёд во времени, а если `timedelta.days` \< 0 – назад. Результирующий объект содержит тот же атрибут [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), что и исходный datetime, при этом выполняется равенство datetime2 - datetime1 == timedelta. Если год datetime2 окажется меньше [`MINYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MAXYEAR), будет возбуждено исключение [`OverflowError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OverflowError). Обратите внимание: корректировка часовых поясов не выполняется, даже если исходный объект осведомлён.9652. Вычисляет datetime2 таким образом, что datetime2 + timedelta == datetime1. Как и при сложении, результат содержит тот же атрибут [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), что и исходный datetime; корректировка часовых поясов не выполняется, даже если исходный объект осведомлён. Данная операция не полностью эквивалентна datetime1 + (-timedelta), поскольку отдельно взятое -timedelta может вызвать переполнение в тех случаях, когда datetime1 - timedelta его не вызывает.9663. Subtraction of a [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) from a [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) is defined only if both operands are naive, or if both are aware. If one is aware and the other is naive, [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) is raised.967968 Если оба объекта наивны (naive), либо оба осведомлены и имеют один и тот же атрибут [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), то атрибуты [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) игнорируются, и результатом будет объект [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) *t* такой, что `datetime2 + t == datetime1`. Корректировка часовых поясов в этом случае не выполняется.969970 Если оба объекта осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), то операция `a-b` ведёт себя так, как если бы *a* и *b* были предварительно преобразованы в наивные UTC-даты. Результат равен `(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`, за исключением того, что реализация никогда не вызывает переполнения.9714. *datetime1* считается меньше *datetime2*, когда *datetime1* предшествует *datetime2* по времени.972973 Если один из сравниваемых объектов наивный, а другой осведомлённый, возбуждается исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError). Если оба осведомлены и имеют один и тот же атрибут [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) игнорируется, и сравниваются базовые даты. Если оба осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), то сравниваемые объекты сначала корректируются вычитанием их UTC-смещений (полученных из `self.utcoffset()`).974975 > **Примечание**976 >977 > In order to stop comparison from falling back to the default scheme of comparing object addresses, datetime comparison normally raises [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) if the other comparand isn’t also a [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) object. However, `NotImplemented` is returned instead if the other comparand has a `timetuple()` attribute. This hook gives other kinds of date objects a chance at implementing mixed-type comparison. If not, when a [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) object is compared to an object of a different type, [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) is raised unless the comparison is `==` or `!=`. The latter cases return [`False`](https://python-all.ru/3.0/library/constants.html#False) or [`True`](https://python-all.ru/3.0/library/constants.html#True), respectively.978979[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) objects can be used as dictionary keys. In Boolean contexts, all [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) objects are considered to be true.980981Методы экземпляра:982983#### `[datetime.datetime.date]datetime.date()`984985Return986987[`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date)988989object with same year, month and day.990991#### `[datetime.datetime.time]datetime.time()`992993Return994995[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)996997object with same hour, minute, second and microsecond.998999[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)10001001is10021003`None`10041005. See also method10061007[`timetz()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.timetz)10081009.10101011#### `[datetime.datetime.timetz]datetime.timetz()`10121013Возвращает объект10141015[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)10161017с теми же значениями hour, minute, second, microsecond и tzinfo. См. также метод10181019[`time()`](https://python-all.ru/3.0/library/datetime.html#datetime.time)10201021.10221023#### `[datetime.datetime.replace]datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])`10241025Возвращает datetime с теми же атрибутами, за исключением тех, для которых указаны новые значения в виде именованных аргументов. Обратите внимание, что можно указать10261027`tzinfo=None`10281029, чтобы создать наивный datetime из осведомлённого без преобразования атрибутов даты и времени.10301031#### `[datetime.datetime.astimezone]datetime.astimezone(tz)`10321033Возвращает объект [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) с новым атрибутом [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) *tz*, корректируя атрибуты даты и времени так, чтобы результат соответствовал тому же UTC-времени, что и *self*, но в местном времени часового пояса *tz*.10341035*tz* должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), а его методы [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.utcoffset) и [`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.dst) не должны возвращать `None`. *self* должен быть осведомлённым (`self.tzinfo` не должен быть `None`, и `self.utcoffset()` не должен возвращать `None`).10361037Если `self.tzinfo` равно *tz*, то `self.astimezone(tz)` равно *self*: никакие атрибуты даты или времени не изменяются. В противном случае результат – это местное время в часовом поясе *tz*, соответствующее тому же UTC-времени, что и *self*: после `astz = dt.astimezone(tz)` атрибуты даты и времени `astz - astz.utcoffset()` обычно совпадают с атрибутами `dt - dt.utcoffset()`. Обсуждение класса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) поясняет случаи на границах перехода на летнее время, когда это недостижимо (проблема возникает только если *tz* моделирует как стандартное, так и летнее время).10381039Если требуется просто привязать объект часового пояса *tz* к datetime *dt* без изменения атрибутов даты и времени, используйте `dt.replace(tzinfo=tz)`. Если требуется просто удалить объект часового пояса из осведомлённого datetime *dt* без преобразования атрибутов даты и времени, используйте `dt.replace(tzinfo=None)`.10401041Note that the default [`tzinfo.fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc) method can be overridden in a [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) subclass to affect the result returned by [`astimezone()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.astimezone). Ignoring error cases, [`astimezone()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.astimezone) acts like:10421043```python1044def astimezone(self, tz):1045 if self.tzinfo is tz:1046 return self1047 # Преобразует self в UTC и присоединяет новый объект временной зоны.1048 utc = (self - self.utcoffset()).replace(tzinfo=tz)1049 # Преобразует из UTC в местное время tz.1050 return tz.fromutc(utc)1051```10521053#### `[datetime.datetime.utcoffset]datetime.utcoffset()`10541055If10561057[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)10581059is10601061`None`10621063, returns10641065`None`10661067, else returns10681069`self.tzinfo.utcoffset(self)`10701071, and raises an exception if the latter doesn’t return10721073`None`10741075, or a10761077[`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)10781079object representing a whole number of minutes with magnitude less than one day.10801081#### `[datetime.datetime.dst]datetime.dst()`10821083If10841085[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)10861087is10881089`None`10901091, returns10921093`None`10941095, else returns10961097`self.tzinfo.dst(self)`10981099, and raises an exception if the latter doesn’t return11001101`None`11021103, or a11041105[`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)11061107object representing a whole number of minutes with magnitude less than one day.11081109#### `[datetime.datetime.tzname]datetime.tzname()`11101111If11121113[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)11141115is11161117`None`11181119, returns11201121`None`11221123, else returns11241125`self.tzinfo.tzname(self)`11261127, raises an exception if the latter doesn’t return11281129`None`11301131or a string object,11321133#### `[datetime.datetime.timetuple]datetime.timetuple()`11341135Возвращает11361137[`time.struct_time`](https://python-all.ru/3.0/library/time.html#time.struct_time)11381139, такой, как возвращается11401141[`time.localtime()`](https://python-all.ru/3.0/library/time.html#time.localtime)11421143.11441145`d.timetuple()`11461147эквивалентно11481149`time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), d.toordinal() - date(d.year, 1, 1).toordinal() + 1, dst))`11501151Флаг11521153`tm_isdst`11541155результата устанавливается в соответствии с методом11561157[`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.dst)11581159: если11601161[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)11621163равен11641165`None`11661167или11681169[`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.dst)11701171возвращает11721173`None`11741175,11761177`tm_isdst`11781179устанавливается в11801181`-1`11821183; иначе, если11841185[`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.dst)11861187возвращает ненулевое значение,11881189`tm_isdst`11901191устанавливается в11921193`1`11941195; иначе11961197`tm_isdst`11981199устанавливается в12001201`0`12021203.12041205#### `[datetime.datetime.utctimetuple]datetime.utctimetuple()`12061207Если экземпляр [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) *d* является наивным, это эквивалентно `d.timetuple()`, за исключением того, что `tm_isdst` принудительно устанавливается в 0 независимо от значения, возвращаемого `d.dst()`. Для времени UTC летнее время никогда не действует.12081209Если *d* осведомлён, то *d* нормализуется к UTC-времени вычитанием `d.utcoffset()`, и для нормализованного времени возвращается [`time.struct_time`](https://python-all.ru/3.0/library/time.html#time.struct_time). Атрибут `tm_isdst` принудительно устанавливается в 0. Обратите внимание, что атрибут `tm_year` результата может быть равен [`MINYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MINYEAR)-1 или [`MAXYEAR`](https://python-all.ru/3.0/library/datetime.html#datetime.MAXYEAR)+1, если год *d* был `MINYEAR` или `MAXYEAR`, и UTC-коррекция переходит через границу года.12101211#### `[datetime.datetime.toordinal]datetime.toordinal()`12121213Возвращает пролептический григорианский порядковый номер даты. Эквивалентно12141215`self.date().toordinal()`12161217.12181219#### `[datetime.datetime.weekday]datetime.weekday()`12201221Возвращает день недели в виде целого числа, где понедельник – 0, воскресенье – 6. Эквивалентно12221223`self.date().weekday()`12241225. См. также12261227[`isoweekday()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.isoweekday)12281229.12301231#### `[datetime.datetime.isoweekday]datetime.isoweekday()`12321233Возвращает день недели в виде целого числа, где понедельник – 1, воскресенье – 7. Эквивалентно12341235`self.date().isoweekday()`12361237. См. также12381239[`weekday()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.weekday)12401241,12421243[`isocalendar()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.isocalendar)12441245.12461247#### `[datetime.datetime.isocalendar]datetime.isocalendar()`12481249Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO). Эквивалентно12501251`self.date().isocalendar()`12521253.12541255#### `[datetime.datetime.isoformat]datetime.isoformat([sep])`12561257Возвращает строку, представляющую дату и время в формате ISO 8601, YYYY-MM-DDTHH:MM:SS.mmmmmm или, если [`microsecond`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.microsecond) равен 0, YYYY-MM-DDTHH:MM:SS12581259Если [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.utcoffset) возвращает не `None`, добавляется строка из 6 символов, указывающая смещение UTC в часах и минутах со знаком: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM или, если [`microsecond`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.microsecond) равен 0 YYYY-MM-DDTHH:MM:SS+HH:MM12601261Необязательный аргумент *sep* (по умолчанию `'T'`) – это односимвольный разделитель, помещаемый между частями даты и времени результата. Например,12621263```python1264>>> from datetime import tzinfo, timedelta, datetime1265>>> class TZ(tzinfo):1266... def utcoffset(self, dt): return timedelta(minutes=-399)1267...1268>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')1269'2002-12-25 00:00:00-06:39'1270```12711272#### `[datetime.datetime.__str__]datetime.__str__()`12731274Для экземпляра12751276[`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime)12771278*d*12791280,12811282`str(d)`12831284эквивалентно12851286`d.isoformat(' ')`12871288.12891290#### `[datetime.datetime.ctime]datetime.ctime()`12911292Возвращает строку, представляющую дату и время, например12931294`datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'`12951296.12971298`d.ctime()`12991300эквивалентно13011302`time.ctime(time.mktime(d.timetuple()))`13031304на платформах, где нативная C-функция13051306`ctime`13071308(которую13091310[`time.ctime()`](https://python-all.ru/3.0/library/time.html#time.ctime)13111312вызывает, но которую13131314[`datetime.ctime()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.ctime)13151316не вызывает) соответствует стандарту C.13171318#### `[datetime.datetime.strftime]datetime.strftime(format)`13191320Возвращает строку, представляющую дату и время, управляемую явной строкой формата. См. раздел13211322[*strftime() Behavior*](https://python-all.ru/3.0/library/datetime.html#strftime-behavior)13231324.13251326Примеры работы с объектами datetime:13271328```python1329>>> from datetime import datetime, date, time1330>>> # Использование datetime.combine()1331>>> d = date(2005, 7, 14)1332>>> t = time(12, 30)1333>>> datetime.combine(d, t)1334datetime.datetime(2005, 7, 14, 12, 30)1335>>> # Использование datetime.now() или datetime.utcnow()1336>>> datetime.now() 1337datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +11338>>> datetime.utcnow() 1339datetime.datetime(2007, 12, 6, 15, 29, 43, 79060)1340>>> # Использование datetime.strptime()1341>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")1342>>> dt1343datetime.datetime(2006, 11, 21, 16, 30)1344>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов1345>>> tt = dt.timetuple()1346>>> for it in tt: 1347... print(it)1348...13492006 # year135011 # month135121 # day135216 # hour135330 # minute13540 # second13551 # weekday (0 = Monday)1356325 # number of days since 1st January1357-1 # dst - method tzinfo.dst() returned None1358>>> # Дата в формате ISO1359>>> ic = dt.isocalendar()1360>>> for it in ic: 1361... print(it)1362...13632006 # ISO year136447 # ISO week13652 # ISO weekday1366>>> # Форматирование datetime1367>>> dt.strftime("%A, %d. %B %Y %I:%M%p")1368'Tuesday, 21. November 2006 04:30PM'1369```13701371Использование datetime с tzinfo:13721373```python1374>>> from datetime import timedelta, datetime, tzinfo1375>>> class GMT1(tzinfo):1376... def __init__(self): # Летнее время начинается в последнее воскресенье марта1377... d = datetime(dt.year, 4, 1) # Заканчивается в последнее воскресенье октября1378... self.dston = d - timedelta(days=d.weekday() + 1)1379... d = datetime(dt.year, 11, 1)1380... self.dstoff = d - timedelta(days=d.weekday() + 1)1381... def utcoffset(self, dt):1382... return timedelta(hours=1) + self.dst(dt)1383... def dst(self, dt):1384... if self.dston <= dt.replace(tzinfo=None) < self.dstoff:1385... return timedelta(hours=1)1386... else:1387... return timedelta(0)1388... def tzname(self,dt):1389... return "GMT +1"1390...1391>>> class GMT2(tzinfo):1392... def __init__(self):1393... d = datetime(dt.year, 4, 1)1394... self.dston = d - timedelta(days=d.weekday() + 1)1395... d = datetime(dt.year, 11, 1)1396... self.dstoff = d - timedelta(days=d.weekday() + 1)1397... def utcoffset(self, dt):1398... return timedelta(hours=1) + self.dst(dt)1399... def dst(self, dt):1400... if self.dston <= dt.replace(tzinfo=None) < self.dstoff:1401... return timedelta(hours=2)1402... else:1403... return timedelta(0)1404... def tzname(self,dt):1405... return "GMT +2"1406...1407>>> gmt1 = GMT1()1408>>> # Летнее время1409>>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1)1410>>> dt1.dst()1411datetime.timedelta(0)1412>>> dt1.utcoffset()1413datetime.timedelta(0, 3600)1414>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1)1415>>> dt2.dst()1416datetime.timedelta(0, 3600)1417>>> dt2.utcoffset()1418datetime.timedelta(0, 7200)1419>>> # Преобразовать datetime в другой часовой пояс1420>>> dt3 = dt2.astimezone(GMT2())1421>>> dt3 # doctest: +ELLIPSIS1422datetime.datetime(2006, 6, 14, 14, 0, tzinfo=<GMT2 object at 0x...>)1423>>> dt2 # doctest: +ELLIPSIS1424datetime.datetime(2006, 6, 14, 13, 0, tzinfo=<GMT1 object at 0x...>)1425>>> dt2.utctimetuple() == dt3.utctimetuple()1426True1427```14281429## [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) Объекты14301431Объект time представляет (местное) время суток, независимо от конкретного дня и может корректироваться с помощью объекта [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo).14321433#### `class datetime.time(hour[, minute[, second[, microsecond[, tzinfo]]]])`14341435Все аргументы необязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами в следующих диапазонах:14361437- `0 <= hour < 24`1438- `0 <= minute < 60`1439- `0 <= секунда < 60`1440- `0 <= микросекунда < 1000000`.14411442Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError). Все аргументы по умолчанию равны `0`, за исключением *tzinfo*, который по умолчанию равен [`None`](https://python-all.ru/3.0/library/constants.html#None).14431444Атрибуты класса:14451446#### `[datetime.time.min]time.min`14471448Самое раннее представимое значение14491450[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)14511452:14531454`time(0, 0, 0, 0)`14551456.14571458#### `[datetime.time.max]time.max`14591460Самое позднее представимое значение14611462[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)14631464:14651466`time(23, 59, 59, 999999)`14671468.14691470#### `[datetime.time.resolution]time.resolution`14711472Наименьшая возможная разница между неравными объектами14731474[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)14751476,14771478`timedelta(microseconds=1)`14791480, однако арифметические операции над объектами14811482[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)14831484не поддерживаются.14851486Атрибуты экземпляра (только для чтения):14871488#### `[datetime.time.hour]time.hour`14891490В диапазоне14911492`range(24)`14931494.14951496#### `[datetime.time.minute]time.minute`14971498В диапазоне14991500`range(60)`15011502.15031504#### `[datetime.time.second]time.second`15051506В диапазоне15071508`range(60)`15091510.15111512#### `[datetime.time.microsecond]time.microsecond`15131514В диапазоне15151516`range(1000000)`15171518.15191520#### `[datetime.time.tzinfo]time.tzinfo`15211522Объект, переданный в качестве аргумента tzinfo конструктору15231524[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)15251526, или15271528`None`15291530, если ничего не было передано.15311532Поддерживаемые операции:15331534- сравнение [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) с [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time), при котором *a* считается меньшим, чем *b*, если *a* предшествует *b* во времени. Если один из операндов наивный, а другой осведомлённый, возникает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError). Если оба операнда осведомлённые и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) игнорируется и сравниваются базовые времена. Если оба операнда осведомлённые и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), операнды сначала корректируются вычитанием их смещений UTC (полученных из `self.utcoffset()`). Чтобы предотвратить сравнение объектов разных типов по умолчанию (по адресу объекта), при сравнении объекта [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) с объектом другого типа возникает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), за исключением случаев сравнения на `==` или `!=`. В последних случаях возвращается [`False`](https://python-all.ru/3.0/library/constants.html#False) или [`True`](https://python-all.ru/3.0/library/constants.html#True) соответственно.1535- хэш, использование в качестве ключа словаря1536- эффективная сериализация (pickling)1537- в логических контекстах объект [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) считается истинным тогда и только тогда, когда после преобразования в минуты и вычитания `utcoffset()` (или `0`, если он равен `None`) результат не равен нулю.15381539Методы экземпляра:15401541#### `[datetime.time.replace]time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]])`15421543Возвращает объект15441545[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)15461547с теми же значениями, за исключением тех атрибутов, которым присваиваются новые значения переданными именованными аргументами. Обратите внимание, что15481549`tzinfo=None`15501551можно указать для создания наивного объекта15521553[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)15541555из осведомлённого15561557[`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time)15581559без преобразования временных атрибутов.15601561#### `[datetime.time.isoformat]time.isoformat()`15621563Возвращает строку, представляющую время в формате ISO 8601: HH:MM:SS.mmmmmm или, если self.microsecond равно 0, HH:MM:SS. Если15641565[`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.time.utcoffset)15661567не возвращает15681569`None`15701571, добавляется 6-символьная строка, указывающая смещение UTC в (знаковых) часах и минутах: HH:MM:SS.mmmmmm+HH:MM или, если self.microsecond равно 0, HH:MM:SS+HH:MM.15721573#### `[datetime.time.__str__]time.__str__()`15741575Для времени15761577*t*15781579вызов15801581`str(t)`15821583эквивалентен15841585`t.isoformat()`15861587.15881589#### `[datetime.time.strftime]time.strftime(format)`15901591Возвращает строку, представляющую время, управляемую явной строкой формата. См. раздел15921593[*strftime() Behavior*](https://python-all.ru/3.0/library/datetime.html#strftime-behavior)15941595.15961597#### `[datetime.time.utcoffset]time.utcoffset()`15981599Если16001601[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)16021603равно16041605`None`16061607, возвращает16081609`None`16101611, иначе возвращает16121613`self.tzinfo.utcoffset(None)`16141615и вызывает исключение, если последний не возвращает16161617`None`16181619или объект16201621[`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)16221623, представляющий целое количество минут с величиной меньше одного дня.16241625#### `[datetime.time.dst]time.dst()`16261627Если16281629[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)16301631равно16321633`None`16341635, возвращает16361637`None`16381639, иначе возвращает16401641`self.tzinfo.dst(None)`16421643и вызывает исключение, если последний не возвращает16441645`None`16461647или объект16481649[`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta)16501651, представляющий целое количество минут с величиной меньше одного дня.16521653#### `[datetime.time.tzname]time.tzname()`16541655Если16561657[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo)16581659равно16601661`None`16621663, возвращает16641665`None`16661667, иначе возвращает16681669`self.tzinfo.tzname(None)`16701671или вызывает исключение, если последний не возвращает16721673`None`16741675или строковый объект.16761677Пример:16781679```python1680>>> from datetime import time, tzinfo1681>>> class GMT1(tzinfo):1682... def utcoffset(self, dt):1683... return timedelta(hours=1)1684... def dst(self, dt):1685... return timedelta(0)1686... def tzname(self,dt):1687... return "Europe/Prague"1688...1689>>> t = time(12, 10, 30, tzinfo=GMT1())1690>>> t # doctest: +ELLIPSIS1691datetime.time(12, 10, 30, tzinfo=<GMT1 object at 0x...>)1692>>> gmt = GMT1()1693>>> t.isoformat()1694'12:10:30+01:00'1695>>> t.dst()1696datetime.timedelta(0)1697>>> t.tzname()1698'Europe/Prague'1699>>> t.strftime("%H:%M:%S %Z")1700'12:10:30 Europe/Prague'1701```17021703## [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) Объекты17041705[`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) – это абстрактный базовый класс, то есть этот класс не следует инстанциировать напрямую. Требуется создать конкретный подкласс и (как минимум) реализовать стандартные методы [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), необходимые для используемых методов [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime). Модуль `datetime` не содержит конкретных подклассов [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo).17061707Экземпляр (конкретного подкласса) [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) может передаваться конструкторам объектов [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time). Последние объекты рассматривают свои атрибуты как местное время, а объект [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) предоставляет методы, раскрывающие смещение местного времени от UTC, название часового пояса и смещение на летнее время – всё относительно переданного им объекта даты или времени.17081709Особое требование для сериализации (pickling): подкласс [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) должен иметь метод [`__init__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__init__), который можно вызвать без аргументов, иначе его можно сериализовать, но, возможно, нельзя будет десериализовать. Это техническое требование, которое может быть смягчено в будущем.17101711Конкретному подклассу [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) может потребоваться реализовать следующие методы. Какие именно методы необходимы, зависит от того, как используются осведомлённые объекты `datetime`. В случае сомнений достаточно реализовать все.17121713#### `[datetime.tzinfo.utcoffset]tzinfo.utcoffset(self, dt)`17141715Возвращает смещение локального времени от UTC в минутах к востоку от UTC. Если локальное время западнее UTC, значение должно быть отрицательным. Обратите внимание, что это полное смещение от UTC; например, если объект [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) представляет как часовой пояс, так и поправки на летнее время, [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.utcoffset) должен возвращать их сумму. Если смещение UTC неизвестно, вернуть `None`. Иначе возвращаемое значение должно быть объектом [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta), задающим целое количество минут в диапазоне от -1439 до 1439 включительно (1440 = 24\*60; величина смещения должна быть меньше одного дня). Большинство реализаций [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.utcoffset), вероятно, будут выглядеть как один из этих двух вариантов:17161717```python1718return CONSTANT # класс с фиксированным смещением1719return CONSTANT + self.dst(dt) # класс, учитывающий летнее время1720```17211722Если [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.utcoffset) не возвращает `None`, [`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.dst) также не должен возвращать `None`.17231724Реализация по умолчанию [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.utcoffset) вызывает [`NotImplementedError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.NotImplementedError).17251726#### `[datetime.tzinfo.dst]tzinfo.dst(self, dt)`17271728Возвращает поправку на летнее время (DST) в минутах к востоку от UTC или `None`, если информация о DST неизвестна. Возвращает `timedelta(0)`, если DST не действует. Если DST действует, возвращает смещение в виде объекта [`timedelta`](https://python-all.ru/3.0/library/datetime.html#datetime.timedelta) (подробнее см. [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.utcoffset)). Обратите внимание, что смещение DST, если применимо, уже добавлено к смещению UTC, возвращаемому [`utcoffset()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.utcoffset), поэтому нет необходимости обращаться к [`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.dst), если только не требуется получить информацию о DST отдельно. Например, [`datetime.timetuple()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.timetuple) вызывает метод [`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.dst) своего атрибута [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), чтобы определить, как должен быть установлен флаг `tm_isdst`, а [`tzinfo.fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc) вызывает [`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.dst) для учёта изменений DST при пересечении часовых поясов.17291730Экземпляр *tz* подкласса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), который моделирует как стандартное, так и летнее время, должен быть согласован в следующем смысле:17311732`tz.utcoffset(dt) - tz.dst(dt)`17331734должно возвращать один и тот же результат для каждого [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) *dt* с `dt.tzinfo == tz`. Для разумных подклассов [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) это выражение даёт «стандартное смещение» часового пояса, которое не должно зависеть от даты или времени, а только от географического положения. Реализация [`datetime.astimezone()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.astimezone) полагается на это, но не может обнаружить нарушения; это обязанность программиста обеспечить это. Если подкласс [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) не может гарантировать это, он может переопределить реализацию по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc), чтобы он корректно работал с `astimezone()` в любом случае.17351736Большинство реализаций [`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.dst), вероятно, будут выглядеть как один из этих двух вариантов:17371738```python1739def dst(self):1740 # класс с фиксированным смещением: не учитывает летнее время1741 return timedelta(0)1742```17431744или17451746```python1747def dst(self):1748 # Код для установки dston и dstoff в значения летнего времени часового пояса1749 # переходные моменты времени на основе входного dt.year и выраженные1750 # в стандартном местном времени. Затем17511752 if dston <= dt.replace(tzinfo=None) < dstoff:1753 return timedelta(hours=1)1754 else:1755 return timedelta(0)1756```17571758Реализация по умолчанию [`dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.dst) вызывает [`NotImplementedError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.NotImplementedError).17591760#### `[datetime.tzinfo.tzname]tzinfo.tzname(self, dt)`17611762Возвращает название часового пояса, соответствующее объекту [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) *dt*, в виде строки. Модуль `datetime` не определяет никаких правил для строковых названий, и нет требования, чтобы они что-то конкретное означали. Например, «GMT», «UTC», «-500», «-5:00», «EDT», «US/Eastern», «America/New York» – все это допустимые ответы. Возвращает `None`, если строковое название неизвестно. Обратите внимание, что это метод, а не фиксированная строка, в первую очередь потому, что некоторые подклассы [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) могут возвращать разные названия в зависимости от конкретного значения переданного *dt*, особенно если класс [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) учитывает летнее время.17631764Реализация по умолчанию [`tzname()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.tzname) вызывает [`NotImplementedError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.NotImplementedError).17651766Эти методы вызываются объектом [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) или [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) в ответ на их методы с теми же именами. Объект [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) передаёт себя в качестве аргумента, а объект [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) передаёт `None` в качестве аргумента. Таким образом, методы подкласса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) должны быть готовы принять аргумент *dt*, который может быть `None` или объектом класса [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime).17671768Когда передаётся `None`, разработчик класса решает, как лучше ответить. Например, возврат `None` уместен, если класс хочет указать, что объекты времени не участвуют в протоколах [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo). Возможно, будет полезнее, чтобы `utcoffset(None)` возвращал стандартное смещение UTC, поскольку нет другого способа узнать стандартное смещение.17691770Когда объект [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) передаётся в ответ на метод [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime), `dt.tzinfo` является тем же объектом, что и *self*. Методы [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) могут полагаться на это, если только пользовательский код не вызывает методы [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) напрямую. Предполагается, что методы [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) интерпретируют *dt* как локальное время и не должны беспокоиться об объектах в других часовых поясах.17711772Существует ещё один метод [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo), который подкласс может захотеть переопределить:17731774#### `[datetime.tzinfo.fromutc]tzinfo.fromutc(self, dt)`17751776Этот метод вызывается из реализации по умолчанию [`datetime.astimezone()`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime.astimezone). При вызове оттуда `dt.tzinfo` равно *self*, а атрибуты даты и времени *dt* должны рассматриваться как представляющие время UTC. Назначение [`fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc) – скорректировать атрибуты даты и времени, вернув эквивалентный datetime в местном времени *self*.17771778Большинство подклассов [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) могут без проблем наследовать реализацию по умолчанию [`fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc). Она достаточно сильна, чтобы обрабатывать часовые пояса с фиксированным смещением и часовые пояса, учитывающие как стандартное, так и летнее время, причём последние даже если время перехода на летнее время различается в разные годы. Пример часового пояса, с которым реализация по умолчанию [`fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc) может не справиться корректно во всех случаях, – это пояс, где стандартное смещение (от UTC) зависит от конкретной переданной даты и времени, что может происходить по политическим причинам. Реализации по умолчанию `astimezone()` и [`fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc) могут не дать желаемый результат, если результат приходится на один из часов, пересекающих момент изменения стандартного смещения.17791780Если не рассматривать код для обработки ошибок, реализация [`fromutc()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.fromutc) по умолчанию действует следующим образом:17811782```python1783def fromutc(self, dt):1784 # вызывает ошибку ValueError, если dt.tzinfo не равен self1785 dtoff = dt.utcoffset()1786 dtdst = dt.dst()1787 # вызывает ValueError, если dtoff или dtdst равны None1788 delta = dtoff - dtdst # это стандартное смещение self1789 if delta:1790 dt += delta # преобразовать в стандартное местное время1791 dtdst = dt.dst()1792 # вызывает ValueError, если dtdst равен None1793 if dtdst:1794 return dt + dtdst1795 else:1796 return dt1797```17981799Примеры классов [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo):18001801```python1802from datetime import tzinfo, timedelta, datetime18031804ZERO = timedelta(0)1805HOUR = timedelta(hours=1)18061807# A UTC class.18081809class UTC(tzinfo):1810 """UTC"""18111812 def utcoffset(self, dt):1813 return ZERO18141815 def tzname(self, dt):1816 return "UTC"18171818 def dst(self, dt):1819 return ZERO18201821utc = UTC()18221823# A class building tzinfo objects for fixed-offset time zones.1824# Note that FixedOffset(0, "UTC") is a different way to build a1825# UTC tzinfo object.18261827class FixedOffset(tzinfo):1828 """Fixed offset in minutes east from UTC."""18291830 def __init__(self, offset, name):1831 self.__offset = timedelta(minutes = offset)1832 self.__name = name18331834 def utcoffset(self, dt):1835 return self.__offset18361837 def tzname(self, dt):1838 return self.__name18391840 def dst(self, dt):1841 return ZERO18421843# A class capturing the platform's idea of local time.18441845import time as _time18461847STDOFFSET = timedelta(seconds = -_time.timezone)1848if _time.daylight:1849 DSTOFFSET = timedelta(seconds = -_time.altzone)1850else:1851 DSTOFFSET = STDOFFSET18521853DSTDIFF = DSTOFFSET - STDOFFSET18541855class LocalTimezone(tzinfo):18561857 def utcoffset(self, dt):1858 if self._isdst(dt):1859 return DSTOFFSET1860 else:1861 return STDOFFSET18621863 def dst(self, dt):1864 if self._isdst(dt):1865 return DSTDIFF1866 else:1867 return ZERO18681869 def tzname(self, dt):1870 return _time.tzname[self._isdst(dt)]18711872 def _isdst(self, dt):1873 tt = (dt.year, dt.month, dt.day,1874 dt.hour, dt.minute, dt.second,1875 dt.weekday(), 0, -1)1876 stamp = _time.mktime(tt)1877 tt = _time.localtime(stamp)1878 return tt.tm_isdst > 018791880Local = LocalTimezone()18811882# A complete implementation of current DST rules for major US time zones.18831884def first_sunday_on_or_after(dt):1885 days_to_go = 6 - dt.weekday()1886 if days_to_go:1887 dt += timedelta(days_to_go)1888 return dt18891890# US DST Rules1891#1892# This is a simplified (i.e., wrong for a few cases) set of rules for US1893# DST start and end times. For a complete and up-to-date set of DST rules1894# and timezone definitions, visit the Olson Database (or try pytz):1895# http://www.twinsun.com/tz/tz-link.htm1896# http://sourceforge.net/projects/pytz/ (might not be up-to-date)1897#1898# In the US, since 2007, DST starts at 2am (standard time) on the second1899# Sunday in March, which is the first Sunday on or after Mar 8.1900DSTSTART_2007 = datetime(1, 3, 8, 2)1901# and ends at 2am (DST time; 1am standard time) on the first Sunday of Nov.1902DSTEND_2007 = datetime(1, 11, 1, 1)1903# From 1987 to 2006, DST used to start at 2am (standard time) on the first1904# Sunday in April and to end at 2am (DST time; 1am standard time) on the last1905# Sunday of October, which is the first Sunday on or after Oct 25.1906DSTSTART_1987_2006 = datetime(1, 4, 1, 2)1907DSTEND_1987_2006 = datetime(1, 10, 25, 1)1908# From 1967 to 1986, DST used to start at 2am (standard time) on the last1909# Sunday in April (the one on or after April 24) and to end at 2am (DST time;1910# 1am standard time) on the last Sunday of October, which is the first Sunday1911# on or after Oct 25.1912DSTSTART_1967_1986 = datetime(1, 4, 24, 2)1913DSTEND_1967_1986 = DSTEND_1987_200619141915class USTimeZone(tzinfo):19161917 def __init__(self, hours, reprname, stdname, dstname):1918 self.stdoffset = timedelta(hours=hours)1919 self.reprname = reprname1920 self.stdname = stdname1921 self.dstname = dstname19221923 def __repr__(self):1924 return self.reprname19251926 def tzname(self, dt):1927 if self.dst(dt):1928 return self.dstname1929 else:1930 return self.stdname19311932 def utcoffset(self, dt):1933 return self.stdoffset + self.dst(dt)19341935 def dst(self, dt):1936 if dt is None or dt.tzinfo is None:1937 # An exception may be sensible here, in one or both cases.1938 # It depends on how you want to treat them. The default1939 # fromutc() implementation (called by the default astimezone()1940 # implementation) passes a datetime with dt.tzinfo is self.1941 return ZERO1942 assert dt.tzinfo is self19431944 # Find start and end times for US DST. For years before 1967, return1945 # ZERO for no DST.1946 if 2006 < dt.year:1947 dststart, dstend = DSTSTART_2007, DSTEND_20071948 elif 1986 < dt.year < 2007:1949 dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_20061950 elif 1966 < dt.year < 1987:1951 dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_19861952 else:1953 return ZERO19541955 start = first_sunday_on_or_after(dststart.replace(year=dt.year))1956 end = first_sunday_on_or_after(dstend.replace(year=dt.year))19571958 # Can't compare naive to aware objects, so strip the timezone from1959 # dt first.1960 if start <= dt.replace(tzinfo=None) < end:1961 return HOUR1962 else:1963 return ZERO19641965Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")1966Central = USTimeZone(-6, "Central", "CST", "CDT")1967Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")1968Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")1969```19701971Обратите внимание, что дважды в год в подклассе [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) который учитывает как стандартное, так и летнее время, в моменты перехода на летнее время возникают неизбежные тонкости. Для конкретности рассмотрим восточное время США (UTC -0500), где EDT начинается через минуту после 1:59 (EST) в первое воскресенье апреля и заканчивается через минуту после 1:59 (EDT) в последнее воскресенье октября:19721973```python1974 UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM1975 EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM1976 EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM19771978start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM19791980 end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM1981```19821983Когда начинается летнее время (строка «start»), местные настенные часы перескакивают с 1:59 на 3:00. Время вида 2:MM в этот день не имеет смысла, поэтому `astimezone(Eastern)` не вернёт результат с `hour == 2` в день начала DST. Чтобы `astimezone()` могла дать такую гарантию, метод `rzinfo.dst()` должен считать время в «пропущенном часе» (2:MM для Eastern) летним временем.19841985Когда летнее время заканчивается (строка «end»), возникает потенциально более серьёзная проблема: есть час, который невозможно однозначно записать в местном настенном времени – последний час летнего времени. Для Eastern это моменты вида 5:MM UTC в день окончания летнего времени. Местные настенные часы перескакивают с 1:59 (летнее время) обратно на 1:00 (стандартное). Местное время вида 1:MM становится неоднозначным. `astimezone()` имитирует поведение местных часов, сопоставляя два соседних часа UTC одному и тому же местному часу. В примере с Eastern моменты UTC вида 5:MM и 6:MM при преобразовании в Eastern оба дают 1:MM. Чтобы `astimezone()` могла дать такую гарантию, метод [`tzinfo.dst()`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo.dst) должен считать время в «повторяющемся часе» стандартным. Этого легко добиться, как в примере, выражая моменты перехода DST в стандартном местном времени часового пояса.19861987Приложения, которые не терпят таких неоднозначностей, должны избегать использования гибридных подклассов [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo); неоднозначностей нет при использовании UTC или любого другого подкласса [`tzinfo`](https://python-all.ru/3.0/library/datetime.html#datetime.tzinfo) с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).19881989## Поведение `strftime()`19901991Объекты [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.0/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) поддерживают метод `strftime(format)` для создания строки, представляющей время в соответствии с заданной строкой формата. В общем, `d.strftime(fmt)` действует как функция `time.strftime(fmt, d.timetuple())` из модуля [`time`](https://python-all.ru/3.0/library/time.html#module-time), хотя не все объекты поддерживают метод `timetuple()`.19921993Для объектов [`time`](https://python-all.ru/3.0/library/datetime.html#datetime.time) коды формата для года, месяца и дня не должны использоваться, поскольку объекты time не содержат таких значений. Если они всё же используются, `1900` подставляется для года, а `0` для месяца и дня.19941995Для объектов [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) коды формата для часов, минут, секунд и микросекунд не должны использоваться, поскольку объекты [`date`](https://python-all.ru/3.0/library/datetime.html#datetime.date) не содержат таких значений. Если они всё же используются, `0` подставляется вместо них.19961997Для наивного объекта коды форматирования `%z` и `%Z` заменяются пустыми строками.19981999Для осведомлённого объекта:20002001**`%z`**20022003`utcoffset()`20042005преобразуется в строку из 5 символов вида +HHMM или -HHMM, где HH – двузначная строка, указывающая количество часов смещения UTC, а MM – двузначная строка, указывающая количество минут смещения UTC. Например, если20062007`utcoffset()`20082009возвращает20102011`timedelta(hours=-3, minutes=-30)`20122013, то20142015`%z`20162017заменяется строкой20182019`'-0330'`20202021.20222023**`%Z`**20242025Если20262027`tzname()`20282029возвращает20302031`None`20322033, то20342035`%Z`20362037заменяется пустой строкой. В противном случае20382039`%Z`20402041заменяется возвращённым значением, которое должно быть строкой.20422043Полный набор поддерживаемых кодов формата зависит от платформы, поскольку Python вызывает функцию `strftime()` из библиотеки C данной платформы, а различия между платформами – обычное дело.20442045Ниже приведён список всех кодов формата, которые требуются стандартом C (версии 1989 года), и они работают на всех платформах со стандартной реализацией C. Обратите внимание, что версия 1999 года стандарта C добавила дополнительные коды формата.20462047Точный диапазон лет, для которых работает `strftime()`, также различается на разных платформах. Независимо от платформы, годы до 1900 использовать нельзя.20482049| Директива | Значение | Примечания |2050| --- | --- | --- |2051| `%a` | Сокращённое название дня недели в соответствии с локалью. | |2052| `%A` | Полное название дня недели в соответствии с локалью. | |2053| `%b` | Сокращённое название месяца в соответствии с локалью. | |2054| `%B` | Полное название месяца в соответствии с локалью. | |2055| `%c` | Представление даты и времени, подходящее для локали. | |2056| `%d` | День месяца в виде десятичного числа \[01,31\]. | |2057| `%f` | Микросекунды в виде десятичного числа \[0,999999\], с дополнением нулями слева. | (1) |2058| `%H` | Часы (24-часовой формат) в виде десятичного числа \[00,23\]. | |2059| `%I` | Часы (12-часовой формат) в виде десятичного числа \[01,12\]. | |2060| `%j` | День года в виде десятичного числа \[001,366\]. | |2061| `%m` | Месяц в виде десятичного числа \[01,12\]. | |2062| `%M` | Минуты в виде десятичного числа \[00,59\]. | |2063| `%p` | Эквивалент AM или PM, зависящий от локали. | (2) |2064| `%S` | Секунды в виде десятичного числа \[00,61\]. | (3) |2065| `%U` | Номер недели в году (воскресенье – первый день недели) в виде десятичного числа \[00,53\]. Все дни нового года до первого воскресенья считаются частью недели 0. | (4) |2066| `%w` | День недели в виде десятичного числа \[0 (воскресенье), 6\]. | |2067| `%W` | Номер недели в году (понедельник – первый день недели) в виде десятичного числа \[00,53\]. Все дни нового года до первого понедельника считаются частью недели 0. | (4) |2068| `%x` | Представление даты, соответствующее локали. | |2069| `%X` | Представление времени, соответствующее локали. | |2070| `%y` | Год без века в виде десятичного числа \[00,99\]. | |2071| `%Y` | Год со столетием в виде десятичного числа. | |2072| `%z` | Смещение UTC в формате +HHMM или -HHMM (пустая строка, если объект наивный). | (5) |2073| `%Z` | Название часового пояса (пустая строка, если объект наивный). | |2074| `%%` | Литеральный символ `'%'`. | |20752076Примечания:207720781. При использовании с функцией `strptime()` директива `%f` принимает от одной до шести цифр и дополняет нулями справа. `%f` – это расширение набора символов формата в стандарте C (но реализовано отдельно в объектах datetime, поэтому всегда доступно).20792. При использовании с функцией `strptime()` директива `%p` влияет только на поле часа на выходе, если директива `%I` используется для парсинга часа.20803. Диапазон на самом деле составляет от `0` до `61`; это учитывает високосные секунды и (очень редкие) двойные високосные секунды.20814. При использовании с функцией `strptime()` директивы `%U` и `%W` используются только в вычислениях, когда указаны день недели и год.20825. Например, если `utcoffset()` возвращает `timedelta(hours=-3, minutes=-30)`, то `%z` заменяется строкой `'-0330'`.2083