datetime.md
1> **Источник:** https://python-all.ru/3.3/library/datetime.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.1. [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) – Основные типы даты и времени89Модуль [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) предоставляет классы для работы с датами и временем как в простых, так и в сложных сценариях. Поддерживается арифметика дат и времени, но основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования вывода и манипуляции. За дополнительными возможностями обращайтесь к модулям [`time`](https://python-all.ru/3.3/library/time.html#module-time) и [`calendar`](https://python-all.ru/3.3/library/calendar.html#module-calendar).1011Существует два вида объектов даты и времени: «наивные» (naive) и «осведомлённые» (aware).1213Осведомлённый объект обладает достаточными знаниями о применимых алгоритмических и политических корректировках времени, таких как информация о часовом поясе и переходе на летнее время, чтобы определить своё положение относительно других осведомлённых объектов. Осведомлённый объект используется для представления конкретного момента времени, не допускающего неоднозначного толкования [\[1\]](https://python-all.ru/3.3/library/datetime.html#id2).1415Наивный объект не содержит достаточно информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Представляет ли наивный объект всемирное координированное время (UTC), местное время или время в каком-то другом часовом поясе – это полностью зависит от программы, точно так же, как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты просты для понимания и работы, ценой игнорирования некоторых аспектов реальности.1617Для приложений, которым требуются осведомлённые объекты, объекты [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) имеют необязательный атрибут информации о часовом поясе [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), который может быть установлен экземпляром подкласса абстрактного класса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo). Эти объекты [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) содержат информацию о смещении от UTC, названии часового пояса и о том, действует ли летнее время. Обратите внимание, что модуль [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) предоставляет только один конкретный класс [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) – класс [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone). Класс [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone) может представлять простые часовые пояса с фиксированным смещением от UTC, например, сам UTC или североамериканские часовые пояса EST и EDT. Поддержка часовых поясов с более глубокими деталями возлагается на приложение. Правила корректировки времени по всему миру больше политические, чем рациональные, часто меняются, и не существует стандарта, подходящего для каждого приложения, кроме UTC.1819Модуль [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) экспортирует следующие константы:2021#### `datetime.MINYEAR`2223Наименьший номер года, допустимый в объекте [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). [`MINYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MINYEAR) равен `1`.2425#### `datetime.MAXYEAR`2627Наибольший номер года, допустимый в объекте [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). [`MAXYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MAXYEAR) равен `9999`.2829> **См. также**30>31> **Модуль [`calendar`](https://python-all.ru/3.3/library/calendar.html#module-calendar)**32>33> Общие функции, связанные с календарём.34>35> **Модуль [`time`](https://python-all.ru/3.3/library/time.html#module-time)**36>37> Доступ к времени и преобразования.3839## 8.1.1. Доступные типы4041#### `class datetime.date`4243Идеализированная наивная дата, исходя из предположения, что текущий григорианский календарь действовал всегда и будет действовать всегда. Атрибуты: `year`, `month`, и `day`.4445#### `class datetime.time`4647Идеализированное время, не привязанное к какому-либо конкретному дню, исходя из предположения, что каждый день содержит ровно 24\*60\*60 секунд (здесь нет понятия «високосных секунд»). Атрибуты: `hour`, `minute`, `second`, `microsecond`, и [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo).4849#### `class datetime.datetime`5051Комбинация даты и времени. Атрибуты: `year`, `month`, `day`, `hour`, `minute`, `second`, `microsecond`, и [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo).5253#### `class datetime.timedelta`5455Продолжительность, выражающая разницу между двумя экземплярами [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date), [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) с точностью до микросекунды.5657#### `class datetime.tzinfo`5859Абстрактный базовый класс для объектов информации о часовом поясе. Они используются классами [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) для обеспечения настраиваемой концепции корректировки времени (например, для учёта часового пояса и/или летнего времени).6061#### `class datetime.timezone`6263Класс, реализующий абстрактный базовый класс [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) в виде фиксированного смещения от UTC.6465Новое в версии 3.2.6667Объекты этих типов неизменяемы.6869Объекты типа [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) всегда наивны.7071Объект типа [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) может быть наивным или осведомлённым. Объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) *d* является осведомлённым, если `d.tzinfo` не равно `None` и `d.tzinfo.utcoffset(d)` не возвращает `None`. Если `d.tzinfo` равно `None`, или если `d.tzinfo` не равно `None`, но `d.tzinfo.utcoffset(d)` возвращает `None`, то *d* является наивным. Объект [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) *t* является осведомлённым, если `t.tzinfo` не равно `None` и `t.tzinfo.utcoffset(None)` не возвращает `None`. В противном случае *t* является наивным.7273Различие между наивными и осведомлёнными объектами не применимо к объектам [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta).7475Отношения подклассов:7677```python78object79 timedelta80 tzinfo81 timezone82 time83 date84 datetime85```8687## 8.1.2. Объекты [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta)8889Объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) представляет продолжительность, разницу между двумя датами или моментами времени.9091#### `class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)`9293Все аргументы необязательны и по умолчанию равны `0`. Аргументы могут быть целыми числами или числами с плавающей запятой, положительными или отрицательными.9495Внутри хранятся только *days*, *seconds* и *microseconds*. Аргументы преобразуются в эти единицы:9697- Миллисекунда преобразуется в 1000 микросекунд.98- Минута преобразуется в 60 секунд.99- Час преобразуется в 3600 секунд.100- Неделя преобразуется в 7 дней.101102а затем дни, секунды и микросекунды нормализуются так, что представление уникально, с103104- `0 <= микросекунды < 1000000`105- `0 <= секунды < 3600*24` (количество секунд в одном дне)106- `-999999999 <= дни <= 999999999`107108Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, дробные микросекунды, оставшиеся от всех аргументов, объединяются и их сумма округляется до ближайшей микросекунды. Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).109110Если нормализованное значение дней выходит за указанный диапазон, возбуждается исключение [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError).111112Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например,113114```python115>>> from datetime import timedelta116>>> d = timedelta(microseconds=-1)117>>> (d.days, d.seconds, d.microseconds)118(-1, 86399, 999999)119```120121Атрибуты класса:122123#### `timedelta.min`124125Наиболее отрицательный объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), `timedelta(-999999999)`.126127#### `timedelta.max`128129Наиболее положительный объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), `timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)`.130131#### `timedelta.resolution`132133Наименьшая возможная разница между неравными объектами [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), `timedelta(microseconds=1)`.134135Обратите внимание, что из-за нормализации `timedelta.max` \> `-timedelta.min`. `-timedelta.max` не представим в виде объекта [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta).136137Атрибуты экземпляра (только для чтения):138139| Атрибут | Значение |140| --- | --- |141| `days` | От -999999999 до 999999999 включительно |142| `seconds` | От 0 до 86399 включительно |143| `microseconds` | От 0 до 999999 включительно |144145Поддерживаемые операции:146147| Операция | Результат |148| --- | --- |149| `t1 = t2 + t3` | Сумма *t2* и *t3*. После этого *t1*-*t2* == *t3* и *t1*-*t3* == *t2* истинны. (1) |150| `t1 = t2 - t3` | Разность *t2* и *t3*. После этого *t1* == *t2* - *t3* и *t2* == *t1* + *t3* истинны. (1) |151| `t1 = t2 * i или t1 = i * t2` | Дельта, умноженная на целое число. После этого *t1* // i == *t2* истинно, при условии `i != 0`. |152| | В общем случае, *t1* \* i == *t1* \* (i-1) + *t1* является истинным. (1) |153| `t1 = t2 * f или t1 = f * t2` | Дельта, умноженная на число с плавающей запятой. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |154| `f = t2 / t3` | Деление (3) *t2* на *t3*. Возвращает объект [`float`](https://python-all.ru/3.3/library/functions.html#float). |155| `t1 = t2 / f или t1 = t2 / i` | Дельта, делённая на число с плавающей запятой или целое число. Результат округляется до ближайшего кратного timedelta.resolution по правилу round-half-to-even. |156| `t1 = t2 // i` или `t1 = t2 // t3` | Вычисляется целая часть от деления, а остаток (если есть) отбрасывается. Во втором случае возвращается целое число. (3) |157| `t1 = t2 % t3` | Остаток вычисляется как объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta). (3) |158| `q, r = divmod(t1, t2)` | Вычисляет частное и остаток: `q = t1 // t2` (3) и `r = t1 % t2`. q – целое число, а r – [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) объект. |159| `+t1` | Возвращает объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) с тем же значением. (2) |160| `-t1` | эквивалентно [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta)(-*t1.days*, -*t1.seconds*, -*t1.microseconds*), и *t1*\* -1. (1)(4) |161| `abs(t)` | эквивалентно +*t*, когда `t.days >= 0`, и -*t*, когда `t.days < 0`. (2) |162| `str(t)` | Возвращает строку вида `[D day[s], ][H]H:MM:SS[.UUUUUU]`, где D отрицательно для отрицательного `t`. (5) |163| `repr(t)` | Возвращает строку вида `datetime.timedelta(D[, S[, U]])`, где D отрицательно для отрицательного `t`. (5) |164165Примечания:1661671. Это точное вычисление, но может произойти переполнение.1682. Это точное вычисление и не может вызвать переполнение.1693. Деление на 0 вызывает [`ZeroDivisionError`](https://python-all.ru/3.3/library/exceptions.html#ZeroDivisionError).1704. *timedelta.max* не представим как объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta).1715. Строковые представления объектов [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных timedelta. Например:172173 ```python174 >>> timedelta(hours=-5)175 datetime.timedelta(-1, 68400)176 >>> print(_)177 -1 day, 19:00:00178 ```179180Помимо перечисленных выше операций, объекты [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) поддерживают определённые сложения и вычитания с объектами [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) и [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) (см. ниже).181182Изменено в версии 3.2: Теперь поддерживаются целочисленное и истинное деление объекта [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) на другой объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), а также операции взятия остатка и функция [`divmod()`](https://python-all.ru/3.3/library/functions.html#divmod). Теперь поддерживаются истинное деление и умножение объекта [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) на объект [`float`](https://python-all.ru/3.3/library/functions.html#float).183184Сравнения объектов [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) поддерживаются: объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) с меньшей продолжительностью считается меньшим timedelta. Чтобы сравнения смешанных типов не использовали сравнение по умолчанию по адресу объекта, при сравнении объекта [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. Последние случаи возвращают соответственно [`False`](https://python-all.ru/3.3/library/constants.html#False) или [`True`](https://python-all.ru/3.3/library/constants.html#True).185186Объекты [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) являются [*хэшируемыми*](https://python-all.ru/3.3/glossary.html#term-hashable) (могут использоваться в качестве ключей словаря), поддерживают эффективную сериализацию и в логическом контексте объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) считается истинным тогда и только тогда, когда он не равен `timedelta(0)`.187188Методы экземпляра:189190#### `timedelta.total_seconds()`191192Возвращает общее количество секунд, содержащихся в интервале. Эквивалентно `td / timedelta(seconds=1)`.193194Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет точность до микросекунд.195196Новое в версии 3.2.197198Пример использования:199200```python201>>> from datetime import timedelta202>>> year = timedelta(days=365)203>>> another_year = timedelta(weeks=40, days=84, hours=23,204... minutes=50, seconds=600) # составляет 365 дней205>>> year.total_seconds()20631536000.0207>>> year == another_year208True209>>> ten_years = 10 * year210>>> ten_years, ten_years.days // 365211(datetime.timedelta(3650), 10)212>>> nine_years = ten_years - year213>>> nine_years, nine_years.days // 365214(datetime.timedelta(3285), 9)215>>> three_years = nine_years // 3;216>>> three_years, three_years.days // 365217(datetime.timedelta(1095), 3)218>>> abs(three_years - ten_years) == 2 * three_years + year219True220```221222## 8.1.3. Объекты [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date)223224Объект [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) представляет дату (год, месяц и день) в идеализированном календаре – текущем григорианском календаре, бесконечно продолженном в обоих направлениях. 1 января 1 года называется днём номер 1, 2 января 1 года называется днём номер 2 и так далее. Это соответствует определению «пролептического григорианского» календаря в книге Дершовица и Рейнгольда «Calendrical Calculations», где он является базовым календарём для всех вычислений. За алгоритмами преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами обращайтесь к этой книге.225226#### `class datetime.date(year, month, day)`227228Все аргументы обязательны. Аргументы могут быть целыми числами в следующих диапазонах:229230- `MINYEAR <= year <= MAXYEAR`231- `1 <= month <= 12`232- `1 <= day <= количество дней в указанном month и year`233234Если задан аргумент вне этих диапазонов, возникает исключение [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).235236Другие конструкторы – все методы класса:237238#### `classmethod date.today()`239240Возвращает текущую локальную дату. Это эквивалентно `date.fromtimestamp(time.time())`.241242#### `classmethod date.fromtimestamp(timestamp)`243244Возвращает локальную дату, соответствующую метке времени POSIX, такую как возвращается [`time.time()`](https://python-all.ru/3.3/library/time.html#time.time). Это может вызвать [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError), если метка времени выходит за пределы значений, поддерживаемых функцией C `localtime()`, и [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError) при ошибке `localtime()`. Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах, не являющихся POSIX, которые включают високосные секунды в своё понятие метки времени, високосные секунды игнорируются [`fromtimestamp()`](https://python-all.ru/3.3/library/datetime.html#datetime.date.fromtimestamp).245246Изменено в версии 3.3: Возбуждает [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError), если метка времени выходит за пределы значений, поддерживаемых функцией C `localtime()`. Возбуждает [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError) при ошибке `localtime()`.247248#### `classmethod date.fromordinal(ordinal)`249250Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1. [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError) возбуждается, если `1 <= ordinal <= date.max.toordinal()` не выполнено. Для любой даты *d*, `date.fromordinal(d.toordinal()) == d`.251252Атрибуты класса:253254#### `date.min`255256Самая ранняя представимая дата, `date(MINYEAR, 1, 1)`.257258#### `date.max`259260Самая поздняя представимая дата, `date(MAXYEAR, 12, 31)`.261262#### `date.resolution`263264Наименьшая возможная разница между неравными объектами даты, `timedelta(days=1)`.265266Атрибуты экземпляра (только для чтения):267268#### `date.year`269270Between [`MINYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MINYEAR) and [`MAXYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MAXYEAR) inclusive.271272#### `date.month`273274От 1 до 12 включительно.275276#### `date.day`277278От 1 до количества дней в указанном месяце указанного года.279280Поддерживаемые операции:281282| Операция | Результат |283| --- | --- |284| `date2 = date1 + timedelta` | *date2* отстоит от *date1* на `timedelta.days` дней . (1) |285| `date2 = date1 - timedelta` | Вычисляет *date2* так, что `date2 + timedelta == date1`. (2) |286| `timedelta = date1 - date2` | (3) |287| `date1 < date2` | *date1* считается меньше *date2*, если *date1* предшествует *date2* во времени. (4) |288289Примечания:2902911. *date2* смещается вперёд во времени, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. После этого `date2 - date1 == timedelta.days`. `timedelta.seconds` и `timedelta.microseconds` игнорируются. [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError) возбуждается, если `date2.year` окажется меньше [`MINYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MAXYEAR).2922. Это не совсем эквивалентно date1 + (-timedelta), поскольку -timedelta сам по себе может вызвать переполнение в случаях, когда date1 - timedelta не вызывает. `timedelta.seconds` и `timedelta.microseconds` игнорируются.2933. Это точная операция и не может вызвать переполнение. timedelta.seconds и timedelta.microseconds равны 0, и после этого date2 + timedelta == date1.2944. Другими словами, `date1 < date2` тогда и только тогда, когда `date1.toordinal() < date2.toordinal()`. Чтобы сравнение не откатывалось к стандартной схеме сравнения адресов объектов, сравнение дат обычно возбуждает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если другой операнд не является объектом [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date). Однако вместо этого возвращается `NotImplemented`, если другой операнд имеет атрибут `timetuple()`. Этот перехват даёт другим видам объектов даты возможность реализовать смешанное сравнение. Если нет, то при сравнении объекта [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращаются соответственно [`False`](https://python-all.ru/3.3/library/constants.html#False) или [`True`](https://python-all.ru/3.3/library/constants.html#True).295296Даты могут использоваться в качестве ключей словаря. В логическом контексте все объекты [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) считаются истинными.297298Методы экземпляра:299300#### `date.replace(year, month, day)`301302Возвращает дату с тем же значением, за исключением параметров, которым заданы новые значения с помощью указанных именованных аргументов. Например, если `d == date(2002, 12, 31)`, то `d.replace(day=26) == date(2002, 12, 26)`.303304#### `date.timetuple()`305306Возвращает [`time.struct_time`](https://python-all.ru/3.3/library/time.html#time.struct_time), такой как возвращается [`time.localtime()`](https://python-all.ru/3.3/library/time.html#time.localtime). Часы, минуты и секунды равны 0, а флаг DST равен -1. `d.timetuple()` эквивалентно `time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))`, где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – номер дня в текущем году, начиная с `1` для 1 января.307308#### `date.toordinal()`309310Возвращает пролептический григорианский порядковый номер даты, где 1 января 1 года имеет порядковый номер 1. Для любого объекта [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) *d*, `date.fromordinal(d.toordinal()) == d`.311312#### `date.weekday()`313314Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. Например, `date(2002, 12, 4).weekday() == 2` – это среда. См. также [`isoweekday()`](https://python-all.ru/3.3/library/datetime.html#datetime.date.isoweekday).315316#### `date.isoweekday()`317318Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. Например, `date(2002, 12, 4).isoweekday() == 3` – это среда. См. также [`weekday()`](https://python-all.ru/3.3/library/datetime.html#datetime.date.weekday), [`isocalendar()`](https://python-all.ru/3.3/library/datetime.html#datetime.date.isocalendar).319320#### `date.isocalendar()`321322Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO).323324ISO-календарь – широко используемый вариант григорианского календаря. См. [http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm](https://python-all.ru/3.3/library/datetime.html) для хорошего объяснения.325326ISO-год состоит из 52 или 53 полных недель, при этом неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя ISO-года – это первая (григорианская) календарная неделя года, в которую входит четверг. Она называется неделей номер 1, и ISO-год этого четверга совпадает с его григорианским годом.327328Например, 2004 год начинается в четверг, поэтому первая неделя ISO-года 2004 начинается в понедельник, 29 декабря 2003 г., и заканчивается в воскресенье, 4 января 2004 г., так что `date(2003, 12, 29).isocalendar() == (2004, 1, 1)` и `date(2004, 1, 4).isocalendar() == (2004, 1, 7)`.329330#### `date.isoformat()`331332Возвращает строку, представляющую дату в формате ISO 8601, ‘YYYY-MM-DD’. Например, `date(2002, 12, 4).isoformat() == '2002-12-04'`.333334#### `date.__str__()`335336Для даты *d*, `str(d)` эквивалентно `d.isoformat()`.337338#### `date.ctime()`339340Возвращает строку, представляющую дату, например `date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'`. `d.ctime()` эквивалентно `time.ctime(time.mktime(d.timetuple()))` на платформах, где встроенная функция C `ctime()` (которую вызывает [`time.ctime()`](https://python-all.ru/3.3/library/time.html#time.ctime), но которую [`date.ctime()`](https://python-all.ru/3.3/library/datetime.html#datetime.date.ctime) не вызывает) соответствует стандарту C.341342#### `date.strftime(format)`343344Возвращает строку, представляющую дату, задаваемую явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. Полный список директив форматирования см. в [*поведении strftime() и strptime()*](https://python-all.ru/3.3/library/datetime.html#strftime-strptime-behavior).345346#### `date.__format__(format)`347348То же, что и [`date.strftime()`](https://python-all.ru/3.3/library/datetime.html#datetime.date.strftime). Это позволяет задавать строку формата для объекта [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) при использовании [`str.format()`](https://python-all.ru/3.3/library/stdtypes.html#str.format). Полный список директив форматирования см. в [*Поведение strftime() и strptime()*](https://python-all.ru/3.3/library/datetime.html#strftime-strptime-behavior).349350Пример подсчёта дней до события:351352```python353>>> import time354>>> from datetime import date355>>> today = date.today()356>>> today357datetime.date(2007, 12, 5)358>>> today == date.fromtimestamp(time.time())359True360>>> my_birthday = date(today.year, 6, 24)361>>> if my_birthday < today:362... my_birthday = my_birthday.replace(year=today.year + 1)363>>> my_birthday364datetime.date(2008, 6, 24)365>>> time_to_birthday = abs(my_birthday - today)366>>> time_to_birthday.days367202368```369370Пример работы с [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date):371372```python373>>> from datetime import date374>>> d = date.fromordinal(730920) # 730920-й день после 1.1.0001375>>> d376datetime.date(2002, 3, 11)377>>> t = d.timetuple()378>>> for i in t: 379... print(i)3802002 # year3813 # month38211 # day3830384038503860 # weekday (0 = Monday)38770 # 70th day in the year388-1389>>> ic = d.isocalendar()390>>> for i in ic: 391... print(i)3922002 # ISO year39311 # ISO week number3941 # ISO day number ( 1 = Monday )395>>> d.isoformat()396'2002-03-11'397>>> d.strftime("%d/%m/%y")398'11/03/02'399>>> d.strftime("%A %d. %B %Y")400'Monday 11. March 2002'401>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")402'The day is 11, the month is March.'403```404405## 8.1.4. [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) Объекты406407Объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) – это единый объект, содержащий всю информацию из объекта [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) и объекта [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time). Как и объект [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) предполагает использование текущего григорианского календаря, расширенного в обоих направлениях; как и объект time, [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) предполагает, что в каждом дне ровно 3600\*24 секунд.408409Конструктор:410411#### `class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)`412413Аргументы year, month и day являются обязательными. *tzinfo* может быть `None`, или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами, в следующих диапазонах:414415- `MINYEAR <= year <= MAXYEAR`416- `1 <= month <= 12`417- `1 <= day <= количество дней в указанном month и year`418- `0 <= hour < 24`419- `0 <= minute < 60`420- `0 <= секунда < 60`421- `0 <= microsecond < 1000000`422423Если задан аргумент вне этих диапазонов, возникает исключение [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).424425Другие конструкторы – все методы класса:426427#### `classmethod datetime.today()`428429Возвращает текущее локальное datetime с [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), равным `None`. Это эквивалентно `datetime.fromtimestamp(time.time())`. См. также [`now()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.now), [`fromtimestamp()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.fromtimestamp).430431#### `classmethod datetime.now(tz=None)`432433Возвращает текущие локальные дату и время. Если необязательный аргумент *tz* равен `None` или не указан, это похоже на [`today()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.today), но, по возможности, обеспечивает большую точность, чем при использовании временной метки [`time.time()`](https://python-all.ru/3.3/library/time.html#time.time) (например, это может быть возможно на платформах, предоставляющих функцию C `gettimeofday()`).434435В противном случае *tz* должен быть экземпляром подкласса класса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), и текущие дата и время преобразуются в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcnow().replace(tzinfo=tz))`. См. также [`today()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.today), [`utcnow()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.utcnow).436437#### `classmethod datetime.utcnow()`438439Возвращает текущие UTC дату и время с [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), равным `None`. Это похоже на [`now()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.now), но возвращает текущие UTC дату и время в виде наивного объекта [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). Осведомленный (aware) текущий UTC datetime можно получить, вызвав `datetime.now(timezone.utc)`. См. также [`now()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.now).440441#### `classmethod datetime.fromtimestamp(timestamp, tz=None)`442443Возвращает локальные дату и время, соответствующие POSIX-временной метке, такой как возвращается функцией [`time.time()`](https://python-all.ru/3.3/library/time.html#time.time). Если необязательный аргумент *tz* равен `None` или не указан, временная метка преобразуется в локальные дату и время платформы, и возвращаемый объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) является наивным.444445В противном случае *tz* должен быть экземпляром подкласса класса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), и временная метка преобразуется в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))`.446447[`fromtimestamp()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.fromtimestamp) может вызвать [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError), если временная метка выходит за пределы диапазона значений, поддерживаемых функциями C `localtime()` или `gmtime()`, и [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError) при ошибке `localtime()` или `gmtime()`. Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что в системах, не совместимых с POSIX, которые включают високосные секунды в свое понятие временной метки, високосные секунды игнорируются функцией [`fromtimestamp()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.fromtimestamp), и тогда возможно иметь две временные метки, отличающиеся на секунду, которые дают одинаковые объекты [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). См. также [`utcfromtimestamp()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.utcfromtimestamp).448449Изменено в версии 3.3: Возникает [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError), если временная метка выходит за пределы диапазона значений, поддерживаемых функциями C `localtime()` или `gmtime()`. Возникает [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError) при ошибке `localtime()` или `gmtime()`.450451#### `classmethod datetime.utcfromtimestamp(timestamp)`452453Возвращает UTC [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), соответствующий POSIX-временной метке, с [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), равным `None`. Это может вызвать [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError), если временная метка выходит за пределы диапазона значений, поддерживаемых функцией C `gmtime()`, и [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError) при ошибке `gmtime()`. Обычно это ограничено годами с 1970 по 2038. См. также [`fromtimestamp()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.fromtimestamp).454455На платформах, совместимых с POSIX, `utcfromtimestamp(timestamp)` эквивалентно следующему выражению:456457```python458datetime(1970, 1, 1) + timedelta(seconds=timestamp)459```460461Изменено в версии 3.3: Возникает [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError) вместо [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError), если временная метка выходит за пределы диапазона значений, поддерживаемых функцией C `gmtime()`. Возникает [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError) вместо [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError) при ошибке `gmtime()`.462463#### `classmethod datetime.fromordinal(ordinal)`464465Возвращает объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1. [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError) возбуждается, если `1 <= ordinal <= datetime.max.toordinal()`. Часы, минуты, секунды и микросекунды результата равны 0, а [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) равно `None`.466467#### `classmethod datetime.combine(date, time)`468469Возвращает новый объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), компоненты даты которого равны соответствующим компонентам переданного объекта [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date), а компоненты времени и атрибут [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) равны соответствующим компонентам переданного объекта [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time). Для любого объекта [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) *d* выполняется `d == datetime.combine(d.date(), d.timetz())`. Если date – объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), его компоненты времени и атрибут [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) игнорируются.470471#### `classmethod datetime.strptime(date_string, format)`472473Возвращает объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), соответствующий строке *date\_string*, разобранной в соответствии с форматом *format*. Эквивалентно `datetime(*(time.strptime(date_string, format)[0:6]))`. [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError) возбуждается, если [`time.strptime()`](https://python-all.ru/3.3/library/time.html#time.strptime) не может разобрать date\_string и format или возвращает значение, не являющееся временным кортежем. Полный список директив форматирования см. в [*strftime() и strptime() – поведение*](https://python-all.ru/3.3/library/datetime.html#strftime-strptime-behavior).474475Атрибуты класса:476477#### `datetime.min`478479Самый ранний представимый объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime): `datetime(MINYEAR, 1, 1, tzinfo=None)`.480481#### `datetime.max`482483Самый поздний представимый объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime): `datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)`.484485#### `datetime.resolution`486487Наименьшая возможная разница между неравными объектами [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime): `timedelta(microseconds=1)`.488489Атрибуты экземпляра (только для чтения):490491#### `datetime.year`492493Between [`MINYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MINYEAR) and [`MAXYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MAXYEAR) inclusive.494495#### `datetime.month`496497От 1 до 12 включительно.498499#### `datetime.day`500501От 1 до количества дней в указанном месяце указанного года.502503#### `datetime.hour`504505В диапазоне `range(24)`.506507#### `datetime.minute`508509В диапазоне `range(60)`.510511#### `datetime.second`512513В диапазоне `range(60)`.514515#### `datetime.microsecond`516517В диапазоне `range(1000000)`.518519#### `datetime.tzinfo`520521Объект, переданный в качестве аргумента *tzinfo* конструктору [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), или `None`, если ничего не передано.522523Поддерживаемые операции:524525| Операция | Результат |526| --- | --- |527| `datetime2 = datetime1 + timedelta` | (1) |528| `datetime2 = datetime1 - timedelta` | (2) |529| `timedelta = datetime1 - datetime2` | (3) |530| `datetime1 < datetime2` | Сравнивает [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) с [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). (4) |5315321. datetime2 – это результат вычитания timedelta из datetime1, при этом происходит перемещение во времени вперёд, если `timedelta.days` \> 0, или назад, если `timedelta.days` \< 0. Результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), что и исходный datetime, и после этого выполняется datetime2 - datetime1 == timedelta. [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError) возбуждается, если datetime2.year окажется меньше [`MINYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.3/library/datetime.html#datetime.MAXYEAR). Обратите внимание, что корректировка часового пояса не производится, даже если входной объект является aware.5332. Вычисляет datetime2 таким образом, что datetime2 + timedelta == datetime1. Как и при сложении, результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), что и исходный datetime, и никакой корректировки часового пояса не производится, даже если входной объект является aware. Это не совсем эквивалентно datetime1 + (-timedelta), потому что -timedelta в отдельности может вызвать переполнение в случаях, когда datetime1 - timedelta его не вызывает.5343. Subtraction of a [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) from a [`datetime`](https://python-all.ru/3.3/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.3/library/exceptions.html#TypeError) is raised.535536 If both are naive, or both are aware and have the same [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) attribute, the [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) attributes are ignored, and the result is a [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) object *t* such that `datetime2 + t == datetime1`. No time zone adjustments are done in this case.537538 If both are aware and have different [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) attributes, `a-b` acts as if *a* and *b* were first converted to naive UTC datetimes first. The result is `(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())` except that the implementation never overflows.5394. *datetime1* считается меньше *datetime2*, когда *datetime1* предшествует *datetime2* по времени.540541 If one comparand is naive and the other is aware, [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError) is raised if an order comparison is attempted. For equality comparisons, naive instances are never equal to aware instances.542543 If both comparands are aware, and have the same [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) attribute, the common [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) attribute is ignored and the base datetimes are compared. If both comparands are aware and have different [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) attributes, the comparands are first adjusted by subtracting their UTC offsets (obtained from `self.utcoffset()`).544545 Changed in version 3.3: Equality comparisons between naive and aware [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) instances don’t raise [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).546547 > **Примечание**548 >549 > 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.3/library/exceptions.html#TypeError) if the other comparand isn’t also a [`datetime`](https://python-all.ru/3.3/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.3/library/datetime.html#datetime.datetime) object is compared to an object of a different type, [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError) is raised unless the comparison is `==` or `!=`. The latter cases return [`False`](https://python-all.ru/3.3/library/constants.html#False) or [`True`](https://python-all.ru/3.3/library/constants.html#True), respectively.550551[`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) objects can be used as dictionary keys. In Boolean contexts, all [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) objects are considered to be true.552553Методы экземпляра:554555#### `datetime.date()`556557Return [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) object with same year, month and day.558559#### `datetime.time()`560561Return [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) object with same hour, minute, second and microsecond. [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) is `None`. See also method [`timetz()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.timetz).562563#### `datetime.timetz()`564565Return [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) object with same hour, minute, second, microsecond, and tzinfo attributes. See also method [`time()`](https://python-all.ru/3.3/library/time.html#module-time).566567#### `datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])`568569Return a datetime with the same attributes, except for those attributes given new values by whichever keyword arguments are specified. Note that `tzinfo=None` can be specified to create a naive datetime from an aware datetime with no conversion of date and time data.570571#### `datetime.astimezone(tz=None)`572573Return a [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) object with new [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) attribute *tz*, adjusting the date and time data so the result is the same UTC time as *self*, but in *tz*‘s local time.574575If provided, *tz* must be an instance of a [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) subclass, and its [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.utcoffset) and [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.dst) methods must not return `None`. *self* must be aware (`self.tzinfo` must not be `None`, and `self.utcoffset()` must not return `None`).576577If called without arguments (or with `tz=None`) the system local timezone is assumed. The `tzinfo` attribute of the converted datetime instance will be set to an instance of [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone) with the zone name and offset obtained from the OS.578579If `self.tzinfo` is *tz*, `self.astimezone(tz)` is equal to *self*: no adjustment of date or time data is performed. Else the result is local time in time zone *tz*, representing the same UTC time as *self*: after `astz = dt.astimezone(tz)`, `astz - astz.utcoffset()` will usually have the same date and time data as `dt - dt.utcoffset()`. The discussion of class [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) explains the cases at Daylight Saving Time transition boundaries where this cannot be achieved (an issue only if *tz* models both standard and daylight time).580581If you merely want to attach a time zone object *tz* to a datetime *dt* without adjustment of date and time data, use `dt.replace(tzinfo=tz)`. If you merely want to remove the time zone object from an aware datetime *dt* without conversion of date and time data, use `dt.replace(tzinfo=None)`.582583Note that the default [`tzinfo.fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc) method can be overridden in a [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) subclass to affect the result returned by [`astimezone()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.astimezone). Ignoring error cases, [`astimezone()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.astimezone) acts like:584585```python586def astimezone(self, tz):587 if self.tzinfo is tz:588 return self589 # Преобразует self в UTC и присоединяет новый объект временной зоны.590 utc = (self - self.utcoffset()).replace(tzinfo=tz)591 # Преобразует из UTC в местное время tz.592 return tz.fromutc(utc)593```594595Изменено в версии 3.3: *tz* теперь можно опускать.596597#### `datetime.utcoffset()`598599If [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) is `None`, returns `None`, else returns `self.tzinfo.utcoffset(self)`, and raises an exception if the latter doesn’t return `None`, or a [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) object representing a whole number of minutes with magnitude less than one day.600601#### `datetime.dst()`602603If [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) is `None`, returns `None`, else returns `self.tzinfo.dst(self)`, and raises an exception if the latter doesn’t return `None`, or a [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) object representing a whole number of minutes with magnitude less than one day.604605#### `datetime.tzname()`606607If [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) is `None`, returns `None`, else returns `self.tzinfo.tzname(self)`, raises an exception if the latter doesn’t return `None` or a string object,608609#### `datetime.timetuple()`610611Return a [`time.struct_time`](https://python-all.ru/3.3/library/time.html#time.struct_time) such as returned by [`time.localtime()`](https://python-all.ru/3.3/library/time.html#time.localtime). `d.timetuple()` is equivalent to `time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))`, where `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` is the day number within the current year starting with `1` for January 1st. The `tm_isdst` flag of the result is set according to the [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.dst) method: [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) is `None` or [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.dst) returns `None`, `tm_isdst` is set to `-1`; else if [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.dst) returns a non-zero value, `tm_isdst` is set to `1`; else `tm_isdst` is set to `0`.612613#### `datetime.utctimetuple()`614615Если экземпляр [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) *d* является наивным, это эквивалентно `d.timetuple()`, за исключением того, что `tm_isdst` принудительно устанавливается в 0 независимо от значения, возвращаемого `d.dst()`. Для времени UTC летнее время никогда не действует.616617Если *d* является осведомлённым, то *d* нормализуется ко времени UTC путём вычитания `d.utcoffset()`, и возвращается [`time.struct_time`](https://python-all.ru/3.3/library/time.html#time.struct_time) для нормализованного времени. `tm_isdst` принудительно устанавливается в 0. Обратите внимание, что может быть возбуждено исключение [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError), если *d*.year равен `MINYEAR` или `MAXYEAR` и коррекция UTC выходит за границу года.618619#### `datetime.toordinal()`620621Возвращает пролептический григорианский порядковый номер даты. Эквивалентно `self.date().toordinal()`.622623#### `datetime.timestamp()`624625Возвращает временную метку POSIX, соответствующую экземпляру [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime). Возвращаемое значение – это [`float`](https://python-all.ru/3.3/library/functions.html#float), похожий на тот, что возвращается функцией [`time.time()`](https://python-all.ru/3.3/library/time.html#time.time).626627Считается, что наивные экземпляры [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) представляют местное время, и этот метод полагается на системную C-функцию `mktime()` для выполнения преобразования. Поскольку [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) поддерживает более широкий диапазон значений, чем `mktime()` на многих платформах, этот метод может возбудить [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError) для моментов времени, далёких в прошлом или будущем.628629Для осведомлённых экземпляров [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) возвращаемое значение вычисляется следующим образом:630631```python632(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()633```634635Новое в версии 3.3.636637> **Примечание**638>639> Не существует метода для получения временной метки POSIX напрямую из наивного экземпляра [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime), представляющего время UTC. Если приложение использует это соглашение и часовой пояс системы не установлен на UTC, временную метку POSIX можно получить, указав `tzinfo=timezone.utc`:640>641> ```python642> timestamp = dt.replace(tzinfo=timezone.utc).timestamp()643> ```644>645> или вычислив метку напрямую:646>647> ```python648> timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)649> ```650651#### `datetime.weekday()`652653Возвращает день недели в виде целого числа, где понедельник – 0, воскресенье – 6. Эквивалентно `self.date().weekday()`. См. также [`isoweekday()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.isoweekday).654655#### `datetime.isoweekday()`656657Возвращает день недели в виде целого числа, где понедельник – 1, воскресенье – 7. Эквивалентно `self.date().isoweekday()`. См. также [`weekday()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.weekday), [`isocalendar()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.isocalendar).658659#### `datetime.isocalendar()`660661Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO). Эквивалентно `self.date().isocalendar()`.662663#### `datetime.isoformat(sep='T')`664665Возвращает строку, представляющую дату и время в формате ISO 8601, YYYY-MM-DDTHH:MM:SS.mmmmmm или, если [`microsecond`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.microsecond) равен 0, YYYY-MM-DDTHH:MM:SS666667Если [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.utcoffset) возвращает не `None`, добавляется строка из 6 символов, указывающая смещение UTC в часах и минутах со знаком: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM или, если [`microsecond`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.microsecond) равен 0 YYYY-MM-DDTHH:MM:SS+HH:MM668669Необязательный аргумент *sep* (по умолчанию `'T'`) – это односимвольный разделитель, помещаемый между частями даты и времени результата. Например,670671```python672>>> from datetime import tzinfo, timedelta, datetime673>>> class TZ(tzinfo):674... def utcoffset(self, dt): return timedelta(minutes=-399)675...676>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')677'2002-12-25 00:00:00-06:39'678```679680#### `datetime.__str__()`681682Для экземпляра [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) *d*, `str(d)` эквивалентно `d.isoformat(' ')`.683684#### `datetime.ctime()`685686Возвращает строку, представляющую дату и время, например `datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'`. `d.ctime()` эквивалентно `time.ctime(time.mktime(d.timetuple()))` на платформах, где родная C-функция `ctime()` (которую вызывает [`time.ctime()`](https://python-all.ru/3.3/library/time.html#time.ctime), но которую [`datetime.ctime()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.ctime) не вызывает) соответствует стандарту C.687688#### `datetime.strftime(format)`689690Возвращает строку, представляющую дату и время, управляемую явной строкой формата. Полный список директив форматирования см. в разделе [*Поведение strftime() и strptime()*](https://python-all.ru/3.3/library/datetime.html#strftime-strptime-behavior).691692#### `datetime.__format__(format)`693694То же, что и [`datetime.strftime()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.strftime). Это позволяет задать строку формата для объекта [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) при использовании [`str.format()`](https://python-all.ru/3.3/library/stdtypes.html#str.format). Полный список директив форматирования см. в разделе [*Поведение strftime() и strptime()*](https://python-all.ru/3.3/library/datetime.html#strftime-strptime-behavior).695696Примеры работы с объектами datetime:697698```python699>>> from datetime import datetime, date, time700>>> # Использование datetime.combine()701>>> d = date(2005, 7, 14)702>>> t = time(12, 30)703>>> datetime.combine(d, t)704datetime.datetime(2005, 7, 14, 12, 30)705>>> # Использование datetime.now() или datetime.utcnow()706>>> datetime.now() 707datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1708>>> datetime.utcnow() 709datetime.datetime(2007, 12, 6, 15, 29, 43, 79060)710>>> # Использование datetime.strptime()711>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")712>>> dt713datetime.datetime(2006, 11, 21, 16, 30)714>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов715>>> tt = dt.timetuple()716>>> for it in tt: 717... print(it)718...7192006 # year72011 # month72121 # day72216 # hour72330 # minute7240 # second7251 # weekday (0 = Monday)726325 # number of days since 1st January727-1 # dst - method tzinfo.dst() returned None728>>> # Дата в формате ISO729>>> ic = dt.isocalendar()730>>> for it in ic: 731... print(it)732...7332006 # ISO year73447 # ISO week7352 # ISO weekday736>>> # Форматирование datetime737>>> dt.strftime("%A, %d. %B %Y %I:%M%p")738'Tuesday, 21. November 2006 04:30PM'739>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")740'The day is 21, the month is November, the time is 04:30PM.'741```742743Использование datetime с tzinfo:744745```python746>>> from datetime import timedelta, datetime, tzinfo747>>> class GMT1(tzinfo):748... def utcoffset(self, dt):749... return timedelta(hours=1) + self.dst(dt)750... def dst(self, dt):751... # Летнее время начинается в последнее воскресенье марта752... d = datetime(dt.year, 4, 1) # Заканчивается в последнее воскресенье октября753... self.dston = d - timedelta(days=d.weekday() + 1)754... d = datetime(dt.year, 11, 1)755... self.dstoff = d - timedelta(days=d.weekday() + 1)756... if self.dston <= dt.replace(tzinfo=None) < self.dstoff:757... return timedelta(hours=1)758... else:759... return timedelta(0)760... def tzname(self,dt):761... return "GMT +1"762...763>>> class GMT2(tzinfo):764... def utcoffset(self, dt):765... return timedelta(hours=2) + self.dst(dt)766... def dst(self, dt):767... d = datetime(dt.year, 4, 1)768... self.dston = d - timedelta(days=d.weekday() + 1)769... d = datetime(dt.year, 11, 1)770... self.dstoff = d - timedelta(days=d.weekday() + 1)771... if self.dston <= dt.replace(tzinfo=None) < self.dstoff:772... return timedelta(hours=1)773... else:774... return timedelta(0)775... def tzname(self,dt):776... return "GMT +2"777...778>>> gmt1 = GMT1()779>>> # Летнее время780>>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1)781>>> dt1.dst()782datetime.timedelta(0)783>>> dt1.utcoffset()784datetime.timedelta(0, 3600)785>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1)786>>> dt2.dst()787datetime.timedelta(0, 3600)788>>> dt2.utcoffset()789datetime.timedelta(0, 7200)790>>> # Преобразовать datetime в другой часовой пояс791>>> dt3 = dt2.astimezone(GMT2())792>>> dt3 793datetime.datetime(2006, 6, 14, 14, 0, tzinfo=<GMT2 object at 0x...>)794>>> dt2 795datetime.datetime(2006, 6, 14, 13, 0, tzinfo=<GMT1 object at 0x...>)796>>> dt2.utctimetuple() == dt3.utctimetuple()797True798```799800## 8.1.5. [`time`](https://python-all.ru/3.3/library/time.html#module-time) Объекты801802Объект time представляет (местное) время суток, независимо от конкретного дня и может корректироваться с помощью объекта [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo).803804#### `class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)`805806Все аргументы необязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами в следующих диапазонах:807808- `0 <= hour < 24`809- `0 <= minute < 60`810- `0 <= секунда < 60`811- `0 <= микросекунда < 1000000`.812813Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError). Все аргументы по умолчанию равны `0`, за исключением *tzinfo*, который по умолчанию равен [`None`](https://python-all.ru/3.3/library/constants.html#None).814815Атрибуты класса:816817#### `time.min`818819Самое раннее представимое значение [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time): `time(0, 0, 0, 0)`.820821#### `time.max`822823Самое позднее представимое значение [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time): `time(23, 59, 59, 999999)`.824825#### `time.resolution`826827Наименьшая возможная разница между неравными объектами [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time): `timedelta(microseconds=1)`, хотя следует отметить, что арифметика над объектами [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) не поддерживается.828829Атрибуты экземпляра (только для чтения):830831#### `time.hour`832833В диапазоне `range(24)`.834835#### `time.minute`836837В диапазоне `range(60)`.838839#### `time.second`840841В диапазоне `range(60)`.842843#### `time.microsecond`844845В диапазоне `range(1000000)`.846847#### `time.tzinfo`848849Объект, переданный в качестве аргумента tzinfo конструктору [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time), или `None`, если ничего не было передано.850851Поддерживаемые операции:852853- сравнение [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) с [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time), где *a* считается меньшим, чем *b*, если *a* предшествует *b* во времени. Если один операнд является наивным, а другой – осведомлённым, при попытке упорядочивающего сравнения возбуждается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError). При сравнении на равенство наивные экземпляры никогда не равны осведомлённым.854855 Если оба операнда осведомлённые и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) игнорируется и сравниваются базовые времена. Если оба операнда осведомлённые и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), операнды сначала корректируются путём вычитания их смещений UTC (полученных из `self.utcoffset()`). Чтобы предотвратить откат сравнений смешанных типов к сравнению по умолчанию по адресу объекта, при сравнении объекта [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращается [`False`](https://python-all.ru/3.3/library/constants.html#False) или [`True`](https://python-all.ru/3.3/library/constants.html#True) соответственно.856857 Изменено в версии 3.3: Сравнения на равенство между наивными и осведомлёнными экземплярами [`time`](https://python-all.ru/3.3/library/time.html#module-time) не возбуждают [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).858- хэш, использование в качестве ключа словаря859- эффективная сериализация (pickling)860- в логических контекстах объект [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) считается истинным тогда и только тогда, когда после преобразования в минуты и вычитания `utcoffset()` (или `0`, если он равен `None`) результат не равен нулю.861862Методы экземпляра:863864#### `time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]])`865866Возвращает объект [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) с теми же значениями, за исключением тех атрибутов, которым присваиваются новые значения через указанные именованные аргументы. Обратите внимание, что `tzinfo=None` можно указать, чтобы создать наивный [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) из осведомлённого [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) без преобразования временных данных.867868#### `time.isoformat()`869870Возвращает строку, представляющую время в формате ISO 8601: HH:MM:SS.mmmmmm или, если self.microsecond равно 0, HH:MM:SS. Если [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.time.utcoffset) не возвращает `None`, добавляется 6-символьная строка, указывающая смещение UTC в (знаковых) часах и минутах: HH:MM:SS.mmmmmm+HH:MM или, если self.microsecond равно 0, HH:MM:SS+HH:MM.871872#### `time.__str__()`873874Для времени *t* вызов `str(t)` эквивалентен `t.isoformat()`.875876#### `time.strftime(format)`877878Возвращает строку, представляющую время, управляемую явной строкой формата. Полный список директив форматирования см. в [*strftime() and strptime() Behavior*](https://python-all.ru/3.3/library/datetime.html#strftime-strptime-behavior).879880#### `time.__format__(format)`881882То же, что и [`time.strftime()`](https://python-all.ru/3.3/library/datetime.html#datetime.time.strftime). Это позволяет задавать строку формата для объекта [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) при использовании [`str.format()`](https://python-all.ru/3.3/library/stdtypes.html#str.format). Полный список директив форматирования см. в [*strftime() and strptime() Behavior*](https://python-all.ru/3.3/library/datetime.html#strftime-strptime-behavior).883884#### `time.utcoffset()`885886Если [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(None)` и вызывает исключение, если последний не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), представляющий целое количество минут с величиной меньше одного дня.887888#### `time.dst()`889890Если [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.dst(None)` и вызывает исключение, если последний не возвращает `None` или объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), представляющий целое количество минут с величиной меньше одного дня.891892#### `time.tzname()`893894Если [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.tzname(None)` или вызывает исключение, если последний не возвращает `None` или строковый объект.895896Пример:897898```python899>>> from datetime import time, tzinfo900>>> class GMT1(tzinfo):901... def utcoffset(self, dt):902... return timedelta(hours=1)903... def dst(self, dt):904... return timedelta(0)905... def tzname(self,dt):906... return "Europe/Prague"907...908>>> t = time(12, 10, 30, tzinfo=GMT1())909>>> t 910datetime.time(12, 10, 30, tzinfo=<GMT1 object at 0x...>)911>>> gmt = GMT1()912>>> t.isoformat()913'12:10:30+01:00'914>>> t.dst()915datetime.timedelta(0)916>>> t.tzname()917'Europe/Prague'918>>> t.strftime("%H:%M:%S %Z")919'12:10:30 Europe/Prague'920>>> 'The {} is {:%H:%M}.'.format("time", t)921'The time is 12:10.'922```923924## 8.1.6. [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) Объекты925926[`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) является абстрактным базовым классом, то есть этот класс не должен создаваться напрямую. Необходимо создать конкретный подкласс и (как минимум) предоставить реализации стандартных методов [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), необходимых для используемых методов [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). Модуль [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) предоставляет простой конкретный подкласс [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone), который может представлять часовые пояса с фиксированным смещением от UTC, такие как сам UTC или североамериканские EST и EDT.927928Экземпляр (конкретного подкласса) [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) может быть передан конструкторам объектов [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time). Последние объекты рассматривают свои атрибуты как локальное время, а объект [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) предоставляет методы, раскрывающие смещение локального времени от UTC, название часового пояса и смещение на летнее время (DST), все относительно переданного им объекта даты или времени.929930Особое требование для сериализации (pickling): подкласс [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) должен иметь метод [`__init__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__init__), который можно вызвать без аргументов, иначе его можно сериализовать, но, возможно, нельзя будет десериализовать. Это техническое требование, которое может быть смягчено в будущем.931932Конкретный подкласс [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) может нуждаться в реализации следующих методов. Какие именно методы необходимы, зависит от того, как используются объекты [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) с информацией о часовом поясе (aware). Если есть сомнения, просто реализуйте все.933934#### `tzinfo.utcoffset(dt)`935936Возвращает смещение локального времени от UTC в минутах к востоку от UTC. Если локальное время западнее UTC, значение должно быть отрицательным. Обратите внимание, что это полное смещение от UTC; например, если объект [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) представляет как часовой пояс, так и поправки на летнее время, [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.utcoffset) должен возвращать их сумму. Если смещение UTC неизвестно, вернуть `None`. Иначе возвращаемое значение должно быть объектом [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), задающим целое количество минут в диапазоне от -1439 до 1439 включительно (1440 = 24\*60; величина смещения должна быть меньше одного дня). Большинство реализаций [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.utcoffset), вероятно, будут выглядеть как один из этих двух вариантов:937938```python939return CONSTANT # класс с фиксированным смещением940return CONSTANT + self.dst(dt) # класс, учитывающий летнее время941```942943Если [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.utcoffset) не возвращает `None`, [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.dst) также не должен возвращать `None`.944945Реализация по умолчанию [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.utcoffset) вызывает [`NotImplementedError`](https://python-all.ru/3.3/library/exceptions.html#NotImplementedError).946947#### `tzinfo.dst(dt)`948949Возвращает поправку на летнее время (DST) в минутах к востоку от UTC или `None`, если информация о DST неизвестна. Возвращает `timedelta(0)`, если летнее время не действует. Если летнее время действует, возвращает смещение в виде объекта [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta) (подробнее см. [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.utcoffset)). Обратите внимание, что смещение на летнее время, если применимо, уже добавлено к смещению UTC, возвращаемому [`utcoffset()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.utcoffset), поэтому нет необходимости обращаться к [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.dst), если вы не заинтересованы в получении информации о DST отдельно. Например, [`datetime.timetuple()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.timetuple) вызывает метод [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.dst) своего атрибута [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), чтобы определить, как должен быть установлен флаг `tm_isdst`, а [`tzinfo.fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc) вызывает [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.dst) для учёта изменений DST при пересечении часовых поясов.950951Экземпляр *tz* подкласса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), который моделирует как стандартное, так и летнее время, должен быть согласован в следующем смысле:952953`tz.utcoffset(dt) - tz.dst(dt)`954955должно возвращать один и тот же результат для каждого [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) *dt* с `dt.tzinfo == tz`. Для разумных подклассов [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) это выражение даёт «стандартное смещение» часового пояса, которое не должно зависеть от даты или времени, а только от географического положения. Реализация [`datetime.astimezone()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.astimezone) полагается на это, но не может обнаружить нарушения; это обязанность программиста обеспечить это. Если подкласс [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) не может гарантировать это, он может переопределить реализацию по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc), чтобы он корректно работал с `astimezone()` в любом случае.956957Большинство реализаций [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.dst), вероятно, будут выглядеть как один из этих двух вариантов:958959```python960def dst(self, dt):961 # класс с фиксированным смещением: не учитывает летнее время962 return timedelta(0)963```964965или966967```python968def dst(self, dt):969 # Код для установки dston и dstoff в значения летнего времени часового пояса970 # переходные моменты времени на основе входного dt.year и выраженные971 # в стандартном местном времени. Затем972973 if dston <= dt.replace(tzinfo=None) < dstoff:974 return timedelta(hours=1)975 else:976 return timedelta(0)977```978979Реализация по умолчанию [`dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.dst) вызывает [`NotImplementedError`](https://python-all.ru/3.3/library/exceptions.html#NotImplementedError).980981#### `tzinfo.tzname(dt)`982983Возвращает название часового пояса, соответствующее объекту [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) *dt*, в виде строки. Модуль [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) ничего не определяет относительно строковых названий и не требует, чтобы они имели какой-то конкретный смысл. Например, «GMT», «UTC», «-500», «-5:00», «EDT», «US/Eastern», «America/New York» – все это допустимые ответы. Возвращает `None`, если строковое название неизвестно. Обратите внимание, что это метод, а не фиксированная строка, в первую очередь потому, что некоторые подклассы [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) могут захотеть возвращать разные названия в зависимости от конкретного значения переданного *dt*, особенно если класс [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) учитывает летнее время.984985Реализация по умолчанию [`tzname()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.tzname) вызывает [`NotImplementedError`](https://python-all.ru/3.3/library/exceptions.html#NotImplementedError).986987Эти методы вызываются объектом [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) или [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) в ответ на их методы с теми же именами. Объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) передаёт себя в качестве аргумента, а объект [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) передаёт `None` в качестве аргумента. Таким образом, методы подкласса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) должны быть готовы принять аргумент *dt*, который может быть `None` или объектом класса [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime).988989Когда передаётся `None`, разработчик класса решает, как лучше ответить. Например, возврат `None` уместен, если класс хочет указать, что объекты времени не участвуют в протоколах [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo). Возможно, будет полезнее, чтобы `utcoffset(None)` возвращал стандартное смещение UTC, поскольку нет другого способа узнать стандартное смещение.990991Когда объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) передаётся в ответ на метод [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), `dt.tzinfo` является тем же объектом, что и *self*. Методы [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) могут полагаться на это, если только пользовательский код не вызывает методы [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) напрямую. Предполагается, что методы [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) интерпретируют *dt* как локальное время и не должны беспокоиться об объектах в других часовых поясах.992993Существует ещё один метод [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), который подкласс может захотеть переопределить:994995#### `tzinfo.fromutc(dt)`996997Этот метод вызывается из реализации по умолчанию [`datetime.astimezone()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.astimezone). При вызове оттуда `dt.tzinfo` равно *self*, а дата и время объекта *dt* должны рассматриваться как выражающие время UTC. Цель [`fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc) – скорректировать данные даты и времени, вернув эквивалентный объект datetime в локальном времени *self*.998999Большинство подклассов [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) могут без проблем наследовать реализацию по умолчанию [`fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc). Она достаточно сильна, чтобы обрабатывать часовые пояса с фиксированным смещением и часовые пояса, учитывающие как стандартное, так и летнее время, причём последние даже если время перехода на летнее время различается в разные годы. Пример часового пояса, с которым реализация по умолчанию [`fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc) может не справиться корректно во всех случаях, – это пояс, где стандартное смещение (от UTC) зависит от конкретной переданной даты и времени, что может происходить по политическим причинам. Реализации по умолчанию `astimezone()` и [`fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc) могут не дать желаемый результат, если результат приходится на один из часов, пересекающих момент изменения стандартного смещения.10001001Если не рассматривать код для обработки ошибок, реализация [`fromutc()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.fromutc) по умолчанию действует следующим образом:10021003```python1004def fromutc(self, dt):1005 # вызывает ошибку ValueError, если dt.tzinfo не равен self1006 dtoff = dt.utcoffset()1007 dtdst = dt.dst()1008 # вызывает ValueError, если dtoff или dtdst равны None1009 delta = dtoff - dtdst # это стандартное смещение self1010 if delta:1011 dt += delta # преобразовать в стандартное местное время1012 dtdst = dt.dst()1013 # вызывает ValueError, если dtdst равен None1014 if dtdst:1015 return dt + dtdst1016 else:1017 return dt1018```10191020Примеры классов [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo):10211022```python1023from datetime import tzinfo, timedelta, datetime10241025ZERO = timedelta(0)1026HOUR = timedelta(hours=1)10271028# Класс UTC.10291030class UTC(tzinfo):1031 """UTC"""10321033 def utcoffset(self, dt):1034 return ZERO10351036 def tzname(self, dt):1037 return "UTC"10381039 def dst(self, dt):1040 return ZERO10411042utc = UTC()10431044# Класс, создающий объекты tzinfo для часовых поясов с фиксированным смещением.1045# Обратите внимание, что FixedOffset(0, "UTC") – это другой способ построения1046# Объект tzinfo UTC.10471048class FixedOffset(tzinfo):1049 """Фиксированное смещение в минутах к востоку от UTC."""10501051 def __init__(self, offset, name):1052 self.__offset = timedelta(minutes=offset)1053 self.__name = name10541055 def utcoffset(self, dt):1056 return self.__offset10571058 def tzname(self, dt):1059 return self.__name10601061 def dst(self, dt):1062 return ZERO10631064# Класс, отражающий представление платформы о местном времени.10651066import time as _time10671068STDOFFSET = timedelta(seconds = -_time.timezone)1069if _time.daylight:1070 DSTOFFSET = timedelta(seconds = -_time.altzone)1071else:1072 DSTOFFSET = STDOFFSET10731074DSTDIFF = DSTOFFSET - STDOFFSET10751076class LocalTimezone(tzinfo):10771078 def utcoffset(self, dt):1079 if self._isdst(dt):1080 return DSTOFFSET1081 else:1082 return STDOFFSET10831084 def dst(self, dt):1085 if self._isdst(dt):1086 return DSTDIFF1087 else:1088 return ZERO10891090 def tzname(self, dt):1091 return _time.tzname[self._isdst(dt)]10921093 def _isdst(self, dt):1094 tt = (dt.year, dt.month, dt.day,1095 dt.hour, dt.minute, dt.second,1096 dt.weekday(), 0, 0)1097 stamp = _time.mktime(tt)1098 tt = _time.localtime(stamp)1099 return tt.tm_isdst > 011001101Local = LocalTimezone()11021103# Полная реализация текущих правил летнего времени для основных часовых поясов США.11041105def first_sunday_on_or_after(dt):1106 days_to_go = 6 - dt.weekday()1107 if days_to_go:1108 dt += timedelta(days_to_go)1109 return dt11101111# Правила летнего времени в США1112#1113# Это упрощённый набор правил для США (т.е. неверный для некоторых случаев)1114# времени начала и окончания летнего времени. Полный и актуальный набор правил летнего времени1115# и определений часовых поясов смотрите в базе данных Olson (или попробуйте pytz):1116# http://www.twinsun.com/tz/tz-link.htm1117# http://sourceforge.net/projects/pytz/ (возможно, неактуально)1118#1119# В США с 2007 года летнее время начинается в 2 часа ночи (стандартное время) во второе1120# воскресенье марта, то есть первое воскресенье 8 марта или после него.1121DSTSTART_2007 = datetime(1, 3, 8, 2)1122# и заканчивается в 2 часа ночи (по летнему времени; 1 час ночи по стандартному времени) в первое воскресенье ноября.1123DSTEND_2007 = datetime(1, 11, 1, 1)1124# С 1987 по 2006 год летнее время начиналось в 2 часа ночи (стандартное время) в первое1125# воскресенье в апреле и заканчиваться в 2 часа ночи (по летнему времени; 1 час ночи по стандартному времени) в последнее1126# воскресенье октября, то есть первое воскресенье 25 октября или после него.1127DSTSTART_1987_2006 = datetime(1, 4, 1, 2)1128DSTEND_1987_2006 = datetime(1, 10, 25, 1)1129# С 1967 по 1986 год летнее время начиналось в 2 часа ночи (стандартное время) в последнее1130# воскресенье апреля (то, которое приходится на 24 апреля или позже) и заканчиваться в 2 часа ночи (по летнему времени;1131# 1 час ночи по стандартному времени) в последнее воскресенье октября, которое является первым воскресеньем1132# 25 октября или позднее.1133DSTSTART_1967_1986 = datetime(1, 4, 24, 2)1134DSTEND_1967_1986 = DSTEND_1987_200611351136class USTimeZone(tzinfo):11371138 def __init__(self, hours, reprname, stdname, dstname):1139 self.stdoffset = timedelta(hours=hours)1140 self.reprname = reprname1141 self.stdname = stdname1142 self.dstname = dstname11431144 def __repr__(self):1145 return self.reprname11461147 def tzname(self, dt):1148 if self.dst(dt):1149 return self.dstname1150 else:1151 return self.stdname11521153 def utcoffset(self, dt):1154 return self.stdoffset + self.dst(dt)11551156 def dst(self, dt):1157 if dt is None or dt.tzinfo is None:1158 # В одном или обоих случаях здесь может быть уместно исключение.1159 # Это зависит от того, как вы хотите их обрабатывать. Реализация по умолчанию1160 # fromutc() (вызываемая реализацией astimezone() по умолчанию)1161 # реализация) передаёт datetime с dt.tzinfo равным self.1162 return ZERO1163 assert dt.tzinfo is self11641165 # Найти время начала и окончания перехода на летнее время в США. Для лет до 1967 года вернуть1166 # ZERO – если переход на летнее время не применяется.1167 if 2006 < dt.year:1168 dststart, dstend = DSTSTART_2007, DSTEND_20071169 elif 1986 < dt.year < 2007:1170 dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_20061171 elif 1966 < dt.year < 1987:1172 dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_19861173 else:1174 return ZERO11751176 start = first_sunday_on_or_after(dststart.replace(year=dt.year))1177 end = first_sunday_on_or_after(dstend.replace(year=dt.year))11781179 # Нельзя сравнивать наивные и осведомлённые объекты, поэтому сначала удалите часовой пояс из1180 # сначала dt.1181 if start <= dt.replace(tzinfo=None) < end:1182 return HOUR1183 else:1184 return ZERO11851186Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")1187Central = USTimeZone(-6, "Central", "CST", "CDT")1188Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")1189Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")1190```11911192Обратите внимание, что дважды в год в подклассе [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), учитывающем как стандартное, так и летнее время, возникают неизбежные тонкости в точках перехода на летнее время. Для конкретики рассмотрим восточное время США (UTC -0500), где летнее время (EDT) начинается через минуту после 1:59 (EST) во второе воскресенье марта и заканчивается через минуту после 1:59 (EDT) в первое воскресенье ноября:11931194```python1195 UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM1196 EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM1197 EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM11981199start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM12001201 end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM1202```12031204Когда начинается летнее время (строка «start»), местные настенные часы перескакивают с 1:59 на 3:00. Местное время вида 2:MM в этот день не имеет смысла, поэтому `astimezone(Eastern)` не вернёт результат с `hour == 2` в день начала DST. Чтобы `astimezone()` могла дать такую гарантию, метод [`tzinfo.dst()`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo.dst) должен считать время в «потерянном часе» (2:MM для Eastern) летним.12051206Когда летнее время заканчивается (строка «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.3/library/datetime.html#datetime.tzinfo.dst) должен считать время в «повторяющемся часе» стандартным. Этого легко добиться, как в примере, выражая моменты перехода DST в стандартном местном времени часового пояса.12071208Приложения, которые не могут мириться с такой неоднозначностью, должны избегать использования гибридных подклассов [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo); неоднозначности отсутствуют при использовании [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone) или любого другого подкласса [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo) с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).12091210> **См. также**1211>1212> **[pytz](https://python-all.ru/3.3/library/datetime.html)**1213>1214> В стандартной библиотеке нет экземпляров [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), кроме UTC, но существует сторонняя библиотека, которая предоставляет *базу данных часовых поясов IANA* (также известную как база данных Olson) для Python: *pytz*.1215>1216> *pytz* содержит актуальную информацию, и его использование рекомендуется.1217>1218> **[база данных часовых поясов IANA](https://python-all.ru/3.3/library/datetime.html)**1219>1220> База данных часовых поясов (часто называемая tz или zoneinfo) содержит код и данные, представляющие историю местного времени для многих характерных точек по всему миру. Она периодически обновляется, чтобы отражать изменения, вносимые политическими органами в границы часовых поясов, смещения UTC и правила перехода на летнее время.12211222## 8.1.7. Объекты [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone)12231224Класс [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone) является подклассом [`tzinfo`](https://python-all.ru/3.3/library/datetime.html#datetime.tzinfo), каждый экземпляр которого представляет часовой пояс, определяемый фиксированным смещением от UTC. Обратите внимание, что объекты этого класса нельзя использовать для представления информации о часовом поясе в местах, где в разные дни года используются разные смещения или где в гражданское время вносились исторические изменения.12251226#### `class datetime.timezone(offset[, name])`12271228Аргумент *offset* должен быть задан как объект [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), представляющий разницу между местным временем и UTC. Он должен быть строго между `-timedelta(hours=24)` и `timedelta(hours=24)` и представлять целое количество минут, иначе выбрасывается [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).12291230Аргумент *name* необязателен. Если он указан, то должен быть строкой, которая используется как значение, возвращаемое методом `tzname(dt)`. В противном случае `tzname(dt)` возвращает строку 'UTC±HH:MM', где s – знак *offset*, HH и MM – две цифры `offset.hours` и `offset.minutes` соответственно.12311232#### `timezone.utcoffset(dt)`12331234Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone). Аргумент *dt* игнорируется. Возвращаемое значение – экземпляр [`timedelta`](https://python-all.ru/3.3/library/datetime.html#datetime.timedelta), равный разнице между местным временем и UTC.12351236#### `timezone.tzname(dt)`12371238Возвращает фиксированное значение, указанное при создании экземпляра [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone), или строку 'UTC±HH:MM', где s – знак *offset*, HH и MM – две цифры `offset.hours` и `offset.minutes` соответственно.12391240#### `timezone.dst(dt)`12411242Всегда возвращает `None`.12431244#### `timezone.fromutc(dt)`12451246Возвращает `dt + offset`. Аргумент *dt* должен быть осведомлённым экземпляром [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime), с `tzinfo`, установленным в `self`.12471248Атрибуты класса:12491250#### `timezone.utc`12511252Часовой пояс UTC, `timezone(timedelta(0))`.12531254## 8.1.8. Поведение `strftime()` и `strptime()`12551256Объекты [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) поддерживают метод `strftime(format)` для создания строки, представляющей время в соответствии с заданной строкой формата. В общем, `d.strftime(fmt)` действует как функция `time.strftime(fmt, d.timetuple())` из модуля [`time`](https://python-all.ru/3.3/library/time.html#module-time), хотя не все объекты поддерживают метод `timetuple()`.12571258И наоборот, метод класса [`datetime.strptime()`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime.strptime) создаёт объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime) из строки, представляющей дату и время, и соответствующей строки формата. `datetime.strptime(date_string, format)` эквивалентно `datetime(*(time.strptime(date_string, format)[0:6]))`.12591260Для объектов [`time`](https://python-all.ru/3.3/library/datetime.html#datetime.time) коды формата для года, месяца и дня не должны использоваться, поскольку объекты time не содержат таких значений. Если они всё же используются, `1900` подставляется для года, а `1` для месяца и дня.12611262Для объектов [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) коды формата для часов, минут, секунд и микросекунд не должны использоваться, поскольку объекты [`date`](https://python-all.ru/3.3/library/datetime.html#datetime.date) не содержат таких значений. Если они всё же используются, `0` подставляется вместо них.12631264Полный набор поддерживаемых кодов формата различается на разных платформах, поскольку Python вызывает функцию `strftime()` из библиотеки C платформы, и вариации между платформами обычны. Чтобы увидеть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации *strftime(3)*.12651266Ниже приведён список всех кодов формата, которые требуются стандартом C (версии 1989 года), и они работают на всех платформах со стандартной реализацией C. Обратите внимание, что версия 1999 года стандарта C добавила дополнительные коды формата.12671268| Директива | Значение | Пример | Примечания |1269| --- | --- | --- | --- |1270| `%a` | День недели как сокращённое название в локали. | Sun, Mon, ..., Sat (en\_US); So, Mo, ..., Sa (de\_DE) | (1) |1271| `%A` | Название дня недели в полной форме, зависящее от локали. | Воскресенье, Понедельник, ..., Суббота (en\_US); Sonntag, Montag, ..., Samstag (de\_DE) | (1) |1272| `%w` | День недели в виде десятичного числа, где 0 – воскресенье, а 6 – суббота. | 0, 1, ..., 6 | |1273| `%d` | День месяца в виде десятичного числа, дополненного слева нулями. | 01, 02, ..., 31 | |1274| `%b` | Название месяца в сокращённой форме, зависящей от локали. | Янв, Фев, ..., Дек (en\_US); Jan, Feb, ..., Dez (de\_DE) | (1) |1275| `%B` | Название месяца в полной форме, зависящей от локали. | Январь, Февраль, ..., Декабрь (en\_US); Januar, Februar, ..., Dezember (de\_DE) | (1) |1276| `%m` | Месяц в виде десятичного числа, дополненного слева нулями. | 01, 02, ..., 12 | |1277| `%y` | Год без столетия в виде десятичного числа, дополненного слева нулями. | 00, 01, ..., 99 | |1278| `%Y` | Год со столетием в виде десятичного числа. | 0001, 0002, ..., 2013, 2014, ..., 9998, 9999 | (2) |1279| `%H` | Часы (в 24-часовом формате) в виде десятичного числа, дополненного слева нулями. | 00, 01, ..., 23 | |1280| `%I` | Часы (в 12-часовом формате) в виде десятичного числа, дополненного слева нулями. | 01, 02, ..., 12 | |1281| `%p` | Эквивалент AM или PM, зависящий от локали. | AM, PM (en\_US); am, pm (de\_DE) | (1), (3) |1282| `%M` | Минуты в виде десятичного числа, дополненного слева нулями. | 00, 01, ..., 59 | |1283| `%S` | Секунды в виде десятичного числа, дополненного слева нулями. | 00, 01, ..., 59 | (4) |1284| `%f` | Микросекунда в виде десятичного числа, дополненного слева нулями. | 000000, 000001, ..., 999999 | (5) |1285| `%z` | Смещение UTC в формате +HHMM или -HHMM (пустая строка, если объект наивный). | (пусто), +0000, -0400, +1030 | (6) |1286| `%Z` | Название часового пояса (пустая строка, если объект наивный). | (пусто), UTC, EST, CST | |1287| `%j` | День года в виде десятичного числа, дополненного слева нулями. | 001, 002, ..., 366 | |1288| `%U` | Номер недели в году (воскресенье – первый день недели) в виде десятичного числа, дополненного нулями слева. Все дни нового года, предшествующие первому воскресенью, считаются неделей 0. | 00, 01, ..., 53 | (7) |1289| `%W` | Номер недели в году (понедельник – первый день недели) в виде десятичного числа. Все дни нового года, предшествующие первому понедельнику, считаются неделей 0. | 00, 01, ..., 53 | (7) |1290| `%c` | Представление даты и времени, подходящее для локали. | Вт Авг 16 21:30:00 1988 (en\_US); Di 16 Aug 21:30:00 1988 (de\_DE) | (1) |1291| `%x` | Представление даты, соответствующее локали. | 08/16/88 (None); 08/16/1988 (en\_US); 16.08.1988 (de\_DE) | (1) |1292| `%X` | Представление времени, соответствующее локали. | 21:30:00 (en\_US); 21:30:00 (de\_DE) | (1) |1293| `%%` | Литеральный символ `'%'`. | % | |12941295Примечания:129612971. Поскольку формат зависит от текущей локали, следует проявлять осторожность при предположениях о выходном значении. Порядок полей различается (например, «месяц/день/год» против «день/месяц/год»), и результат может содержать символы Unicode, закодированные с использованием кодировки по умолчанию для данной локали (например, если текущая локаль – `ja_JP`, то кодировкой по умолчанию может быть `eucJP`, `SJIS` или `utf-8`; используйте [`locale.getlocale()`](https://python-all.ru/3.3/library/locale.html#locale.getlocale) для определения кодировки текущей локали).12982. Метод `strptime()` может разбирать годы в полном диапазоне \[1, 9999\], но годы \< 1000 должны дополняться нулями до 4-значной ширины.12991300 Изменено в версии 3.2: В предыдущих версиях метод `strftime()` был ограничен годами \>= 1900.13011302 Изменено в версии 3.3: В версии 3.2 метод `strftime()` был ограничен годами \>= 1000.13033. При использовании с методом `strptime()` директива `%p` влияет на поле часа на выходе только если директива `%I` используется для разбора часа.13044. В отличие от модуля [`time`](https://python-all.ru/3.3/library/time.html#module-time), модуль [`datetime`](https://python-all.ru/3.3/library/datetime.html#module-datetime) не поддерживает високосные секунды.13055. При использовании с методом `strptime()` директива `%f` принимает от одной до шести цифр и дополняет нулями справа. `%f` является расширением набора символов форматирования в стандарте C (но реализовано отдельно в объектах datetime, и поэтому всегда доступно).13066. Для наивного объекта коды форматирования `%z` и `%Z` заменяются пустыми строками.13071308 Для осведомлённого объекта:13091310 **`%z`**13111312 `utcoffset()` преобразуется в строку из 5 символов вида +HHMM или -HHMM, где HH – двухсимвольная строка, представляющая количество часов смещения UTC, а MM – двухсимвольная строка, представляющая количество минут смещения UTC. Например, если `utcoffset()` возвращает `timedelta(hours=-3, minutes=-30)`, то `%z` заменяется строкой `'-0330'`.13131314 **`%Z`**13151316 Если `tzname()` возвращает `None`, то `%Z` заменяется пустой строкой. В противном случае `%Z` заменяется возвращаемым значением, которое должно быть строкой.13171318 Изменено в версии 3.2: Когда директива `%z` передается методу `strptime()`, будет создан осведомленный объект [`datetime`](https://python-all.ru/3.3/library/datetime.html#datetime.datetime). Поле `tzinfo` результата будет установлено в экземпляр [`timezone`](https://python-all.ru/3.3/library/datetime.html#datetime.timezone).13197. При использовании с методом `strptime()`, `%U` и `%W` используются в вычислениях только если указаны день недели и год.13201321Сноски13221323| [\[1\]](https://python-all.ru/3.3/library/datetime.html#id1) | Если, конечно, не учитывать эффекты теории относительности |1324| --- | --- |1325