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

datetime.md

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

1> **Источник:** https://python-all.ru/3.1/library/datetime.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.1. `datetime` – Основные типы даты и времени89Модуль `datetime` предоставляет классы для работы с датами и временем как в простых, так и в сложных сценариях. Поддерживается арифметика дат и времени, но основное внимание в реализации уделяется эффективному извлечению отдельных компонентов для форматирования вывода и преобразований. Дополнительные возможности см. также в модулях [`time`](https://python-all.ru/3.1/library/time.html#module-time) и [`calendar`](https://python-all.ru/3.1/library/calendar.html#module-calendar).1011Существует два типа объектов даты и времени: «наивные» и «осведомлённые». Это различие указывает на то, учитывает ли объект часовой пояс, переход на летнее время или другие алгоритмические или политические корректировки времени. Представляет ли наивный объект [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) всемирное координированное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит исключительно от программы – точно так же, как от программы зависит, обозначает ли конкретное число метры, мили или массу. Наивные объекты [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) просты для понимания и работы, но ценой игнорирования некоторых аспектов реальности.1213Для приложений, которым требуется больше возможностей, объекты [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) содержат необязательный атрибут информации о часовом поясе [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), который может содержать экземпляр подкласса абстрактного класса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo). Эти объекты [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) содержат информацию о смещении от UTC, названии часового пояса и о том, действует ли переход на летнее время. Обратите внимание, что модуль `datetime` не предоставляет конкретных реализаций класса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo). Поддержка часовых поясов с требуемым уровнем детализации возлагается на приложение. Правила корректировки времени по всему миру скорее политические, чем рациональные, и не существует стандарта, подходящего для всех приложений.1415Модуль `datetime` предоставляет следующие константы:1617#### `datetime.MINYEAR`1819Наименьший номер года, допустимый в объекте2021[`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date)2223или2425[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)2627.2829[`MINYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MINYEAR)3031равен3233`1`3435.3637#### `datetime.MAXYEAR`3839Наибольший номер года, допустимый в объекте4041[`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date)4243или4445[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)4647.4849[`MAXYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MAXYEAR)5051равен5253`9999`5455.5657> **См. также**58>59> **Модуль [`calendar`](https://python-all.ru/3.1/library/calendar.html#module-calendar)**60>61> Общие функции, связанные с календарём.62>63> **Модуль [`time`](https://python-all.ru/3.1/library/time.html#module-time)**64>65> Доступ к времени и преобразования.6667## 8.1.1. Доступные типы6869#### `class datetime.date`7071Идеализированная наивная дата, исходя из предположения, что текущий григорианский календарь действовал всегда и будет действовать всегда. Атрибуты:7273`year`7475,7677`month`7879, и8081`day`8283.8485#### `class datetime.time`8687Идеализированное время, не привязанное к какому-либо конкретному дню, исходя из предположения, что каждый день содержит ровно 24\*60\*60 секунд (здесь нет понятия «високосных секунд»). Атрибуты:8889`hour`9091,9293`minute`9495,9697`second`9899,100101`microsecond`102103, и104105[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)106107.108109#### `class datetime.datetime`110111Комбинация даты и времени. Атрибуты:112113`year`114115,116117`month`118119,120121`day`122123,124125`hour`126127,128129`minute`130131,132133`second`134135,136137`microsecond`138139, и140141[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)142143.144145#### `class datetime.timedelta`146147Продолжительность, выражающая разницу между двумя экземплярами148149[`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date)150151,152153[`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time)154155или156157[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)158159с точностью до микросекунды.160161#### `class datetime.tzinfo`162163Абстрактный базовый класс для объектов информации о часовом поясе. Они используются классами164165[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)166167и168169[`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time)170171для обеспечения настраиваемой концепции корректировки времени (например, для учёта часового пояса и/или летнего времени).172173Объекты этих типов неизменяемы.174175Объекты типа [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) всегда наивны.176177Объект *d* типа [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) может быть наивным или осведомлённым. *d* является осведомлённым, если `d.tzinfo` не равно `None` и `d.tzinfo.utcoffset(d)` не возвращает `None`. Если `d.tzinfo` равно `None`, или если `d.tzinfo` не равно `None`, но `d.tzinfo.utcoffset(d)` возвращает `None`, то *d* является наивным.178179Различие между наивными и осведомлёнными объектами не применимо к объектам [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta).180181Отношения подклассов:182183```python184object185    timedelta186    tzinfo187    time188    date189        datetime190```191192## 8.1.2. Объекты [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)193194Объект [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) представляет продолжительность, разницу между двумя датами или моментами времени.195196#### `class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)`197198Все аргументы необязательны и по умолчанию равны `0`. Аргументы могут быть целыми числами или числами с плавающей запятой, положительными или отрицательными.199200Внутри хранятся только *days*, *seconds* и *microseconds*. Аргументы преобразуются в эти единицы:201202- Миллисекунда преобразуется в 1000 микросекунд.203- Минута преобразуется в 60 секунд.204- Час преобразуется в 3600 секунд.205- Неделя преобразуется в 7 дней.206207а затем дни, секунды и микросекунды нормализуются так, что представление уникально, с208209- `0 <= микросекунды < 1000000`210- `0 <= секунды < 3600*24` (количество секунд в одном дне)211- `-999999999 <= дни <= 999999999`212213Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, дробные микросекунды, оставшиеся от всех аргументов, объединяются и их сумма округляется до ближайшей микросекунды. Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).214215Если нормализованное значение дней выходит за указанный диапазон, возбуждается исключение [`OverflowError`](https://python-all.ru/3.1/library/exceptions.html#OverflowError).216217Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например,218219```python220>>> from datetime import timedelta221>>> d = timedelta(microseconds=-1)222>>> (d.days, d.seconds, d.microseconds)223(-1, 86399, 999999)224```225226Атрибуты класса:227228#### `timedelta.min`229230Наиболее отрицательный объект231232[`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)233234,235236`timedelta(-999999999)`237238.239240#### `timedelta.max`241242Наиболее положительный объект243244[`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)245246,247248`timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)`249250.251252#### `timedelta.resolution`253254Наименьшая возможная разница между неравными объектами255256[`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)257258,259260`timedelta(microseconds=1)`261262.263264Обратите внимание, что из-за нормализации `timedelta.max` \> `-timedelta.min`. `-timedelta.max` не представим в виде объекта [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta).265266Атрибуты экземпляра (только для чтения):267268| Атрибут | Значение |269| --- | --- |270| `days` | От -999999999 до 999999999 включительно |271| `seconds` | От 0 до 86399 включительно |272| `microseconds` | От 0 до 999999 включительно |273274Поддерживаемые операции:275276| Операция | Результат |277| --- | --- |278| `t1 = t2 + t3` | Сумма *t2* и *t3*. После этого *t1*-*t2* == *t3* и *t1*-*t3* == *t2* истинны. (1) |279| `t1 = t2 - t3` | Разность *t2* и *t3*. После этого *t1* == *t2* - *t3* и *t2* == *t1* + *t3* истинны. (1) |280| `t1 = t2 * i или t1 = i * t2` | Дельта, умноженная на целое число. После этого *t1* // i == *t2* истинно, при условии `i != 0`. |281|  | В общем случае, *t1* \* i == *t1* \* (i-1) + *t1* является истинным. (1) |282| `t1 = t2 // i` | Вычисляется целая часть от деления, а остаток (если есть) отбрасывается. (3) |283| `+t1` | Возвращает объект [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) с тем же значением. (2) |284| `-t1` | эквивалентно [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)(-*t1.days*, -*t1.seconds*, -*t1.microseconds*), и *t1*\* -1. (1)(4) |285| `abs(t)` | эквивалентно +*t*, когда `t.days >= 0`, и -*t*, когда `t.days < 0`. (2) |286| `str(t)` | Возвращает строку вида `[D day[s], ][H]H:MM:SS[.UUUUUU]`, где D отрицательно для отрицательного `t`. (5) |287| `repr(t)` | Возвращает строку вида `datetime.timedelta(D[, S[, U]])`, где D отрицательно для отрицательного `t`. (5) |288289Примечания:2902911. Это точное вычисление, но может произойти переполнение.2922. Это точное вычисление и не может вызвать переполнение.2933. Деление на 0 вызывает [`ZeroDivisionError`](https://python-all.ru/3.1/library/exceptions.html#ZeroDivisionError).2944. *timedelta.max* не представим как объект [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta).2955. Строковые представления объектов [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных timedelta. Например:296297   ```python298   >>> timedelta(hours=-5)299   datetime.timedelta(-1, 68400)300   >>> print(_)301   -1 day, 19:00:00302   ```303304Помимо перечисленных выше операций, объекты [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) поддерживают определённые сложения и вычитания с объектами [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) и [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) (см. ниже).305306Сравнения объектов [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) поддерживаются: объект [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) с меньшей продолжительностью считается меньшим timedelta. Чтобы сравнения смешанных типов не использовали сравнение по умолчанию по адресу объекта, при сравнении объекта [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. Последние случаи возвращают соответственно [`False`](https://python-all.ru/3.1/library/constants.html#False) или [`True`](https://python-all.ru/3.1/library/constants.html#True).307308Объекты [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) являются [*хэшируемыми*](https://python-all.ru/3.1/glossary.html#term-hashable) (могут использоваться в качестве ключей словаря), поддерживают эффективную сериализацию и в логическом контексте объект [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) считается истинным тогда и только тогда, когда он не равен `timedelta(0)`.309310Пример использования:311312```python313>>> from datetime import timedelta314>>> year = timedelta(days=365)315>>> another_year = timedelta(weeks=40, days=84, hours=23,316...                          minutes=50, seconds=600)  # составляет 365 дней317>>> year == another_year318True319>>> ten_years = 10 * year320>>> ten_years, ten_years.days // 365321(datetime.timedelta(3650), 10)322>>> nine_years = ten_years - year323>>> nine_years, nine_years.days // 365324(datetime.timedelta(3285), 9)325>>> three_years = nine_years // 3;326>>> three_years, three_years.days // 365327(datetime.timedelta(1095), 3)328>>> abs(three_years - ten_years) == 2 * three_years + year329True330```331332## 8.1.3. Объекты [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date)333334Объект [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) представляет дату (год, месяц и день) в идеализированном календаре – текущем григорианском календаре, бесконечно продолженном в обоих направлениях. 1 января 1 года называется днём номер 1, 2 января 1 года называется днём номер 2 и так далее. Это соответствует определению «пролептического григорианского» календаря в книге Дершовица и Рейнгольда «Calendrical Calculations», где он является базовым календарём для всех вычислений. За алгоритмами преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами обращайтесь к этой книге.335336#### `class datetime.date(year, month, day)`337338Все аргументы обязательны. Аргументы могут быть целыми числами в следующих диапазонах:339340- `MINYEAR <= year <= MAXYEAR`341- `1 <= month <= 12`342- `1 <= day <= количество дней в указанном month и year`343344Если задан аргумент вне этих диапазонов, возникает исключение [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError).345346Другие конструкторы – все методы класса:347348#### `classmethod date.today()`349350Возвращает текущую локальную дату. Это эквивалентно351352`date.fromtimestamp(time.time())`353354.355356#### `classmethod date.fromtimestamp(timestamp)`357358Возвращает локальную дату, соответствующую метке времени POSIX, например, такую, как возвращает359360[`time.time()`](https://python-all.ru/3.1/library/time.html#time.time)361362. Может возникнуть исключение363364[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)365366, если метка времени выходит за пределы диапазона значений, поддерживаемого функцией C367368`localtime()`369370на данной платформе. Обычно это ограничивает диапазон годами с 1970 по 2038. Обратите внимание, что в не-POSIX системах, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются функцией371372[`fromtimestamp()`](https://python-all.ru/3.1/library/datetime.html#datetime.date.fromtimestamp)373374.375376#### `classmethod date.fromordinal(ordinal)`377378Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1.379380[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)381382возбуждается, если383384`1 <= ordinal <= date.max.toordinal()`385386не выполнено. Для любой даты387388*d*389390,391392`date.fromordinal(d.toordinal()) == d`393394.395396Атрибуты класса:397398#### `date.min`399400Самая ранняя представимая дата,401402`date(MINYEAR, 1, 1)`403404.405406#### `date.max`407408Самая поздняя представимая дата,409410`date(MAXYEAR, 12, 31)`411412.413414#### `date.resolution`415416Наименьшая возможная разница между неравными объектами даты,417418`timedelta(days=1)`419420.421422Атрибуты экземпляра (только для чтения):423424#### `date.year`425426Between427428[`MINYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MINYEAR)429430and431432[`MAXYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MAXYEAR)433434inclusive.435436#### `date.month`437438От 1 до 12 включительно.439440#### `date.day`441442От 1 до количества дней в указанном месяце указанного года.443444Поддерживаемые операции:445446| Операция | Результат |447| --- | --- |448| `date2 = date1 + timedelta` | *date2* отстоит от *date1* на `timedelta.days` дней . (1) |449| `date2 = date1 - timedelta` | Вычисляет *date2* так, что `date2 + timedelta == date1`. (2) |450| `timedelta = date1 - date2` | (3) |451| `date1 < date2` | *date1* считается меньше *date2*, если *date1* предшествует *date2* во времени. (4) |452453Примечания:4544551. *date2* смещается вперёд во времени, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. После этого `date2 - date1 == timedelta.days`. `timedelta.seconds` и `timedelta.microseconds` игнорируются. [`OverflowError`](https://python-all.ru/3.1/library/exceptions.html#OverflowError) возбуждается, если `date2.year` окажется меньше [`MINYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MAXYEAR).4562. Это не совсем эквивалентно date1 + (-timedelta), поскольку -timedelta сам по себе может вызвать переполнение в случаях, когда date1 - timedelta не вызывает. `timedelta.seconds` и `timedelta.microseconds` игнорируются.4573. Это точная операция и не может вызвать переполнение. timedelta.seconds и timedelta.microseconds равны 0, и после этого date2 + timedelta == date1.4584. Другими словами, `date1 < date2` тогда и только тогда, когда `date1.toordinal() < date2.toordinal()`. Чтобы сравнение не откатывалось к стандартной схеме сравнения адресов объектов, сравнение дат обычно возбуждает [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError), если другой операнд не является объектом [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date). Однако вместо этого возвращается `NotImplemented`, если другой операнд имеет атрибут `timetuple()`. Этот перехват даёт другим видам объектов даты возможность реализовать смешанное сравнение. Если нет, то при сравнении объекта [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращаются соответственно [`False`](https://python-all.ru/3.1/library/constants.html#False) или [`True`](https://python-all.ru/3.1/library/constants.html#True).459460Даты могут использоваться в качестве ключей словаря. В логическом контексте все объекты [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) считаются истинными.461462Методы экземпляра:463464#### `date.replace(year, month, day)`465466Возвращает дату с тем же значением, за исключением тех членов, которым заданы новые значения с помощью указанных именованных аргументов. Например, если467468`d == date(2002, 12, 31)`469470, то471472`d.replace(day=26) == date(2002, 12, 26)`473474.475476#### `date.timetuple()`477478Возвращает479480[`time.struct_time`](https://python-all.ru/3.1/library/time.html#time.struct_time)481482, такой как возвращается483484[`time.localtime()`](https://python-all.ru/3.1/library/time.html#time.localtime)485486. Часы, минуты и секунды равны 0, а флаг DST равен -1.487488`d.timetuple()`489490эквивалентно491492`time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))`493494, где495496`yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`497498– номер дня в текущем году, начиная с499500`1`501502для 1 января.503504#### `date.toordinal()`505506Возвращает пролептический григорианский порядковый номер даты, где 1 января 1 года имеет порядковый номер 1. Для любого объекта507508[`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date)509510*d*511512,513514`date.fromordinal(d.toordinal()) == d`515516.517518#### `date.weekday()`519520Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. Например,521522`date(2002, 12, 4).weekday() == 2`523524– это среда. См. также525526[`isoweekday()`](https://python-all.ru/3.1/library/datetime.html#datetime.date.isoweekday)527528.529530#### `date.isoweekday()`531532Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. Например,533534`date(2002, 12, 4).isoweekday() == 3`535536– это среда. См. также537538[`weekday()`](https://python-all.ru/3.1/library/datetime.html#datetime.date.weekday)539540,541542[`isocalendar()`](https://python-all.ru/3.1/library/datetime.html#datetime.date.isocalendar)543544.545546#### `date.isocalendar()`547548Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO).549550ISO-календарь – широко используемый вариант григорианского календаря. См. [http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm](https://python-all.ru/3.1/library/datetime.html) для хорошего объяснения.551552ISO-год состоит из 52 или 53 полных недель, при этом неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя ISO-года – это первая (григорианская) календарная неделя года, в которую входит четверг. Она называется неделей номер 1, и ISO-год этого четверга совпадает с его григорианским годом.553554Например, 2004 год начинается в четверг, поэтому первая неделя ISO-года 2004 начинается в понедельник, 29 декабря 2003 г., и заканчивается в воскресенье, 4 января 2004 г., так что `date(2003, 12, 29).isocalendar() == (2004, 1, 1)` и `date(2004, 1, 4).isocalendar() == (2004, 1, 7)`.555556#### `date.isoformat()`557558Возвращает строку, представляющую дату в формате ISO 8601, ‘YYYY-MM-DD’. Например,559560`date(2002, 12, 4).isoformat() == '2002-12-04'`561562.563564#### `date.__str__()`565566Для даты567568*d*569570,571572`str(d)`573574эквивалентно575576`d.isoformat()`577578.579580#### `date.ctime()`581582Возвращает строку, представляющую дату, например583584`date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'`585586.587588`d.ctime()`589590эквивалентно591592`time.ctime(time.mktime(d.timetuple()))`593594на платформах, где встроенная функция C595596`ctime()`597598(которую вызывает599600[`time.ctime()`](https://python-all.ru/3.1/library/time.html#time.ctime)601602, но которую603604[`date.ctime()`](https://python-all.ru/3.1/library/datetime.html#datetime.date.ctime)605606не вызывает) соответствует стандарту C.607608#### `date.strftime(format)`609610Возвращает строковое представление даты, управляемое явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. См. раздел611612[*Поведение strftime() и strptime()*](https://python-all.ru/3.1/library/datetime.html#strftime-strptime-behavior)613614.615616Пример подсчёта дней до события:617618```python619>>> import time620>>> from datetime import date621>>> today = date.today()622>>> today623datetime.date(2007, 12, 5)624>>> today == date.fromtimestamp(time.time())625True626>>> my_birthday = date(today.year, 6, 24)627>>> if my_birthday < today:628...     my_birthday = my_birthday.replace(year=today.year + 1)629>>> my_birthday630datetime.date(2008, 6, 24)631>>> time_to_birthday = abs(my_birthday - today)632>>> time_to_birthday.days633202634```635636Пример работы с [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date):637638```python639>>> from datetime import date640>>> d = date.fromordinal(730920) # 730920-й день после 1.1.0001641>>> d642datetime.date(2002, 3, 11)643>>> t = d.timetuple()644>>> for i in t:     645...     print(i)6462002                # year6473                   # month64811                  # day6490650065106520                   # weekday (0 = Monday)65370                  # 70th day in the year654-1655>>> ic = d.isocalendar()656>>> for i in ic:    657...     print(i)6582002                # ISO year65911                  # ISO week number6601                   # ISO day number ( 1 = Monday )661>>> d.isoformat()662'2002-03-11'663>>> d.strftime("%d/%m/%y")664'11/03/02'665>>> d.strftime("%A %d. %B %Y")666'Monday 11. March 2002'667```668669## 8.1.4. [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) Объекты670671Объект [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) – это единый объект, содержащий всю информацию из объекта [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) и объекта [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time). Как и объект [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) предполагает использование текущего григорианского календаря, расширенного в обоих направлениях; как и объект time, [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) предполагает, что в каждом дне ровно 3600\*24 секунд.672673Конструктор:674675#### `class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)`676677Аргументы year, month и day являются обязательными. *tzinfo* может быть `None`, или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами, в следующих диапазонах:678679- `MINYEAR <= year <= MAXYEAR`680- `1 <= month <= 12`681- `1 <= day <= количество дней в указанном month и year`682- `0 <= hour < 24`683- `0 <= minute < 60`684- `0 <= секунда < 60`685- `0 <= microsecond < 1000000`686687Если задан аргумент вне этих диапазонов, возникает исключение [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError).688689Другие конструкторы – все методы класса:690691#### `classmethod datetime.today()`692693Возвращает текущее локальное datetime с694695[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)696697, равным698699`None`700701. Это эквивалентно702703`datetime.fromtimestamp(time.time())`704705. См. также706707[`now()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.now)708709,710711[`fromtimestamp()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.fromtimestamp)712713.714715#### `classmethod datetime.now(tz=None)`716717Возвращает текущие локальные дату и время. Если необязательный аргумент *tz* равен `None` или не указан, это похоже на [`today()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.today), но, по возможности, обеспечивает большую точность, чем при использовании временной метки [`time.time()`](https://python-all.ru/3.1/library/time.html#time.time) (например, это может быть возможно на платформах, предоставляющих функцию C `gettimeofday()`).718719В противном случае *tz* должен быть экземпляром подкласса класса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), и текущие дата и время преобразуются в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcnow().replace(tzinfo=tz))`. См. также [`today()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.today), [`utcnow()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.utcnow).720721#### `classmethod datetime.utcnow()`722723Возвращает текущие дату и время в UTC, с724725[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)726727`None`728729. Это подобно730731[`now()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.now)732733, но возвращает текущие дату и время в UTC в виде наивного734735[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)736737объекта. См. также738739[`now()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.now)740741.742743#### `classmethod datetime.fromtimestamp(timestamp, tz=None)`744745Возвращает локальные дату и время, соответствующие POSIX-временной метке, такой как возвращается функцией [`time.time()`](https://python-all.ru/3.1/library/time.html#time.time). Если необязательный аргумент *tz* равен `None` или не указан, временная метка преобразуется в локальные дату и время платформы, и возвращаемый объект [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) является наивным.746747В противном случае *tz* должен быть экземпляром подкласса класса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), и временная метка преобразуется в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))`.748749[`fromtimestamp()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.fromtimestamp) может возбуждать [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError), если метка времени выходит за пределы диапазона значений, поддерживаемого `localtime()` или `gmtime()` на данной платформе. Обычно это ограничено годами с 1970 по 2038. Обратите внимание, что в не-POSIX системах, которые включают високосные секунды в своё представление метки времени, високосные секунды игнорируются [`fromtimestamp()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.fromtimestamp), и тогда возможно, что две метки времени, отличающиеся на секунду, дадут одинаковые объекты [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime). Смотрите также [`utcfromtimestamp()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.utcfromtimestamp).750751#### `classmethod datetime.utcfromtimestamp(timestamp)`752753Возвращает UTC754755[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)756757, соответствующий POSIX-метке времени, с758759[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)760761`None`762763. Может возбуждать764765[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)766767, если метка времени выходит за пределы диапазона значений, поддерживаемого функцией C768769`gmtime()`770771. Обычно это ограничено годами с 1970 по 2038. Смотрите также772773[`fromtimestamp()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.fromtimestamp)774775.776777#### `classmethod datetime.fromordinal(ordinal)`778779Возвращает объект780781[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)782783, соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1.784785[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)786787возбуждается, если788789`1 <= ordinal <= datetime.max.toordinal()`790791. Часы, минуты, секунды и микросекунды результата равны 0, а792793[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)794795равно796797`None`798799.800801#### `classmethod datetime.combine(date, time)`802803Возвращает новый объект804805[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)806807, чьи члены даты равны соответствующим членам заданного объекта808809[`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date)810811, а члены времени и812813[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)814815равны членам заданного объекта816817[`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time)818819. Для любого объекта820821[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)822823*d*824825,826827`d == datetime.combine(d.date(), d.timetz())`828829. Если date является объектом830831[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)832833, его члены времени и834835[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)836837игнорируются.838839#### `classmethod datetime.strptime(date_string, format)`840841Возвращает842843[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)844845, соответствующий846847*date\_string*848849, разобранному в соответствии с850851*format*852853. Это эквивалентно854855`datetime(*(time.strptime(date_string, format)[0:6]))`856857.858859[`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError)860861возбуждается, если date\_string и format не могут быть разобраны862863[`time.strptime()`](https://python-all.ru/3.1/library/time.html#time.strptime)864865или если функция возвращает значение, не являющееся временным кортежем. Смотрите раздел866867[*Поведение strftime() и strptime()*](https://python-all.ru/3.1/library/datetime.html#strftime-strptime-behavior)868869.870871Атрибуты класса:872873#### `datetime.min`874875Самый ранний представимый объект876877[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)878879:880881`datetime(MINYEAR, 1, 1, tzinfo=None)`882883.884885#### `datetime.max`886887Самый поздний представимый объект888889[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)890891:892893`datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)`894895.896897#### `datetime.resolution`898899Наименьшая возможная разница между неравными объектами900901[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)902903:904905`timedelta(microseconds=1)`906907.908909Атрибуты экземпляра (только для чтения):910911#### `datetime.year`912913Between914915[`MINYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MINYEAR)916917and918919[`MAXYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MAXYEAR)920921inclusive.922923#### `datetime.month`924925От 1 до 12 включительно.926927#### `datetime.day`928929От 1 до количества дней в указанном месяце указанного года.930931#### `datetime.hour`932933В диапазоне934935`range(24)`936937.938939#### `datetime.minute`940941В диапазоне942943`range(60)`944945.946947#### `datetime.second`948949В диапазоне950951`range(60)`952953.954955#### `datetime.microsecond`956957В диапазоне958959`range(1000000)`960961.962963#### `datetime.tzinfo`964965Объект, переданный в качестве аргумента966967*tzinfo*968969конструктору970971[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)972973, или974975`None`976977, если ничего не передано.978979Поддерживаемые операции:980981| Операция | Результат |982| --- | --- |983| `datetime2 = datetime1 + timedelta` | (1) |984| `datetime2 = datetime1 - timedelta` | (2) |985| `timedelta = datetime1 - datetime2` | (3) |986| `datetime1 < datetime2` | Сравнивает [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) с [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime). (4) |9879881. datetime2 – это datetime1, из которого вычтен timedelta. Если `timedelta.days` \> 0, результат сдвигается вперёд во времени, а если `timedelta.days` \< 0 – назад. Результирующий объект содержит тот же атрибут [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), что и исходный datetime, при этом выполняется равенство datetime2 - datetime1 == timedelta. Если год datetime2 окажется меньше [`MINYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MAXYEAR), будет возбуждено исключение [`OverflowError`](https://python-all.ru/3.1/library/exceptions.html#OverflowError). Обратите внимание: корректировка часовых поясов не выполняется, даже если исходный объект осведомлён.9892. Вычисляет datetime2 таким образом, что datetime2 + timedelta == datetime1. Как и при сложении, результат содержит тот же атрибут [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), что и исходный datetime; корректировка часовых поясов не выполняется, даже если исходный объект осведомлён. Данная операция не полностью эквивалентна datetime1 + (-timedelta), поскольку отдельно взятое -timedelta может вызвать переполнение в тех случаях, когда datetime1 - timedelta его не вызывает.9903. Subtraction of a [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) from a [`datetime`](https://python-all.ru/3.1/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.1/library/exceptions.html#TypeError) is raised.991992   Если оба объекта наивны (naive), либо оба осведомлены и имеют один и тот же атрибут [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), то атрибуты [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) игнорируются, и результатом будет объект [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) *t* такой, что `datetime2 + t == datetime1`. Корректировка часовых поясов в этом случае не выполняется.993994   Если оба объекта осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), то операция `a-b` ведёт себя так, как если бы *a* и *b* были предварительно преобразованы в наивные UTC-даты. Результат равен `(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`, за исключением того, что реализация никогда не вызывает переполнения.9954. *datetime1* считается меньше *datetime2*, когда *datetime1* предшествует *datetime2* по времени.996997   Если один из сравниваемых объектов наивный, а другой осведомлённый, возбуждается исключение [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError). Если оба осведомлены и имеют один и тот же атрибут [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) игнорируется, и сравниваются базовые даты. Если оба осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), то сравниваемые объекты сначала корректируются вычитанием их UTC-смещений (полученных из `self.utcoffset()`).998999   > **Примечание**1000   >1001   > 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.1/library/exceptions.html#TypeError) if the other comparand isn’t also a [`datetime`](https://python-all.ru/3.1/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.1/library/datetime.html#datetime.datetime) object is compared to an object of a different type, [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError) is raised unless the comparison is `==` or `!=`. The latter cases return [`False`](https://python-all.ru/3.1/library/constants.html#False) or [`True`](https://python-all.ru/3.1/library/constants.html#True), respectively.10021003[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) objects can be used as dictionary keys. In Boolean contexts, all [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) objects are considered to be true.10041005Методы экземпляра:10061007#### `datetime.date()`10081009Return10101011[`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date)10121013object with same year, month and day.10141015#### `datetime.time()`10161017Return10181019[`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time)10201021object with same hour, minute, second and microsecond.10221023[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)10241025is10261027`None`10281029. See also method10301031[`timetz()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.timetz)10321033.10341035#### `datetime.timetz()`10361037Возвращает объект10381039[`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time)10401041с теми же значениями hour, minute, second, microsecond и tzinfo. См. также метод10421043[`time()`](https://python-all.ru/3.1/library/datetime.html#datetime.time)10441045.10461047#### `datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])`10481049Возвращает datetime с теми же атрибутами, за исключением тех, для которых указаны новые значения в виде именованных аргументов. Обратите внимание, что можно указать10501051`tzinfo=None`10521053, чтобы создать наивный datetime из осведомлённого без преобразования атрибутов даты и времени.10541055#### `datetime.astimezone(tz)`10561057Возвращает объект [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) с новым атрибутом [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) *tz*, корректируя атрибуты даты и времени так, чтобы результат соответствовал тому же UTC-времени, что и *self*, но в местном времени часового пояса *tz*.10581059*tz* должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), а его методы [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.utcoffset) и [`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.dst) не должны возвращать `None`. *self* должен быть осведомлённым (`self.tzinfo` не должен быть `None`, и `self.utcoffset()` не должен возвращать `None`).10601061Если `self.tzinfo` равно *tz*, то `self.astimezone(tz)` равно *self*: никакие атрибуты даты или времени не изменяются. В противном случае результат – это местное время в часовом поясе *tz*, соответствующее тому же UTC-времени, что и *self*: после `astz = dt.astimezone(tz)` атрибуты даты и времени `astz - astz.utcoffset()` обычно совпадают с атрибутами `dt - dt.utcoffset()`. Обсуждение класса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) поясняет случаи на границах перехода на летнее время, когда это недостижимо (проблема возникает только если *tz* моделирует как стандартное, так и летнее время).10621063Если требуется просто привязать объект часового пояса *tz* к datetime *dt* без изменения атрибутов даты и времени, используйте `dt.replace(tzinfo=tz)`. Если требуется просто удалить объект часового пояса из осведомлённого datetime *dt* без преобразования атрибутов даты и времени, используйте `dt.replace(tzinfo=None)`.10641065Note that the default [`tzinfo.fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc) method can be overridden in a [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) subclass to affect the result returned by [`astimezone()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.astimezone). Ignoring error cases, [`astimezone()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.astimezone) acts like:10661067```python1068def astimezone(self, tz):1069    if self.tzinfo is tz:1070        return self1071    # Преобразует self в UTC и присоединяет новый объект временной зоны.1072    utc = (self - self.utcoffset()).replace(tzinfo=tz)1073    # Преобразует из UTC в местное время tz.1074    return tz.fromutc(utc)1075```10761077#### `datetime.utcoffset()`10781079If10801081[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)10821083is10841085`None`10861087, returns10881089`None`10901091, else returns10921093`self.tzinfo.utcoffset(self)`10941095, and raises an exception if the latter doesn’t return10961097`None`10981099, or a11001101[`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)11021103object representing a whole number of minutes with magnitude less than one day.11041105#### `datetime.dst()`11061107If11081109[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)11101111is11121113`None`11141115, returns11161117`None`11181119, else returns11201121`self.tzinfo.dst(self)`11221123, and raises an exception if the latter doesn’t return11241125`None`11261127, or a11281129[`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)11301131object representing a whole number of minutes with magnitude less than one day.11321133#### `datetime.tzname()`11341135If11361137[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)11381139is11401141`None`11421143, returns11441145`None`11461147, else returns11481149`self.tzinfo.tzname(self)`11501151, raises an exception if the latter doesn’t return11521153`None`11541155or a string object,11561157#### `datetime.timetuple()`11581159Return a11601161[`time.struct_time`](https://python-all.ru/3.1/library/time.html#time.struct_time)11621163such as returned by11641165[`time.localtime()`](https://python-all.ru/3.1/library/time.html#time.localtime)11661167.11681169`d.timetuple()`11701171is equivalent to11721173`time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))`11741175, where11761177`yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`11781179is the day number within the current year starting with11801181`1`11821183for January 1st. The11841185`tm_isdst`11861187flag of the result is set according to the11881189[`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.dst)11901191method:11921193[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)11941195is11961197`None`11981199or12001201[`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.dst)12021203returns12041205`None`12061207,12081209`tm_isdst`12101211is set to12121213`-1`12141215; else if12161217[`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.dst)12181219returns a non-zero value,12201221`tm_isdst`12221223is set to12241225`1`12261227; else12281229`tm_isdst`12301231is set to12321233`0`12341235.12361237#### `datetime.utctimetuple()`12381239Если экземпляр [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) *d* является наивным, это эквивалентно `d.timetuple()`, за исключением того, что `tm_isdst` принудительно устанавливается в 0 независимо от значения, возвращаемого `d.dst()`. Для времени UTC летнее время никогда не действует.12401241Если *d* осведомлён, то *d* нормализуется к UTC-времени вычитанием `d.utcoffset()`, и для нормализованного времени возвращается [`time.struct_time`](https://python-all.ru/3.1/library/time.html#time.struct_time). Атрибут `tm_isdst` принудительно устанавливается в 0. Обратите внимание, что атрибут `tm_year` результата может быть равен [`MINYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MINYEAR)-1 или [`MAXYEAR`](https://python-all.ru/3.1/library/datetime.html#datetime.MAXYEAR)+1, если год *d* был `MINYEAR` или `MAXYEAR`, и UTC-коррекция переходит через границу года.12421243#### `datetime.toordinal()`12441245Возвращает пролептический григорианский порядковый номер даты. Эквивалентно12461247`self.date().toordinal()`12481249.12501251#### `datetime.weekday()`12521253Возвращает день недели в виде целого числа, где понедельник – 0, воскресенье – 6. Эквивалентно12541255`self.date().weekday()`12561257. См. также12581259[`isoweekday()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.isoweekday)12601261.12621263#### `datetime.isoweekday()`12641265Возвращает день недели в виде целого числа, где понедельник – 1, воскресенье – 7. Эквивалентно12661267`self.date().isoweekday()`12681269. См. также12701271[`weekday()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.weekday)12721273,12741275[`isocalendar()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.isocalendar)12761277.12781279#### `datetime.isocalendar()`12801281Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO). Эквивалентно12821283`self.date().isocalendar()`12841285.12861287#### `datetime.isoformat(sep='T')`12881289Возвращает строку, представляющую дату и время в формате ISO 8601, YYYY-MM-DDTHH:MM:SS.mmmmmm или, если [`microsecond`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.microsecond) равен 0, YYYY-MM-DDTHH:MM:SS12901291Если [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.utcoffset) возвращает не `None`, добавляется строка из 6 символов, указывающая смещение UTC в часах и минутах со знаком: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM или, если [`microsecond`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.microsecond) равен 0 YYYY-MM-DDTHH:MM:SS+HH:MM12921293Необязательный аргумент *sep* (по умолчанию `'T'`) – это односимвольный разделитель, помещаемый между частями даты и времени результата. Например,12941295```python1296>>> from datetime import tzinfo, timedelta, datetime1297>>> class TZ(tzinfo):1298...     def utcoffset(self, dt): return timedelta(minutes=-399)1299...1300>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')1301'2002-12-25 00:00:00-06:39'1302```13031304#### `datetime.__str__()`13051306Для экземпляра13071308[`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime)13091310*d*13111312,13131314`str(d)`13151316эквивалентно13171318`d.isoformat(' ')`13191320.13211322#### `datetime.ctime()`13231324Возвращает строку, представляющую дату и время, например13251326`datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'`13271328.13291330`d.ctime()`13311332эквивалентно13331334`time.ctime(time.mktime(d.timetuple()))`13351336на платформах, где родная C-функция13371338`ctime()`13391340(которую вызывает13411342[`time.ctime()`](https://python-all.ru/3.1/library/time.html#time.ctime)13431344, но которую13451346[`datetime.ctime()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.ctime)13471348не вызывает) соответствует стандарту C.13491350#### `datetime.strftime(format)`13511352Возвращает строку, представляющую дату и время, управляемую явной строкой формата. См. раздел13531354[*Поведение strftime() и strptime()*](https://python-all.ru/3.1/library/datetime.html#strftime-strptime-behavior)13551356.13571358Примеры работы с объектами datetime:13591360```python1361>>> from datetime import datetime, date, time1362>>> # Использование datetime.combine()1363>>> d = date(2005, 7, 14)1364>>> t = time(12, 30)1365>>> datetime.combine(d, t)1366datetime.datetime(2005, 7, 14, 12, 30)1367>>> # Использование datetime.now() или datetime.utcnow()1368>>> datetime.now()   1369datetime.datetime(2007, 12, 6, 16, 29, 43, 79043)   # GMT +11370>>> datetime.utcnow()   1371datetime.datetime(2007, 12, 6, 15, 29, 43, 79060)1372>>> # Использование datetime.strptime()1373>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")1374>>> dt1375datetime.datetime(2006, 11, 21, 16, 30)1376>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов1377>>> tt = dt.timetuple()1378>>> for it in tt:   1379...     print(it)1380...13812006    # year138211      # month138321      # day138416      # hour138530      # minute13860       # second13871       # weekday (0 = Monday)1388325     # number of days since 1st January1389-1      # dst - method tzinfo.dst() returned None1390>>> # Дата в формате ISO1391>>> ic = dt.isocalendar()1392>>> for it in ic:   1393...     print(it)1394...13952006    # ISO year139647      # ISO week13972       # ISO weekday1398>>> # Форматирование datetime1399>>> dt.strftime("%A, %d. %B %Y %I:%M%p")1400'Tuesday, 21. November 2006 04:30PM'1401```14021403Использование datetime с tzinfo:14041405```python1406>>> from datetime import timedelta, datetime, tzinfo1407>>> class GMT1(tzinfo):1408...     def __init__(self):         # Летнее время начинается в последнее воскресенье марта1409...         d = datetime(dt.year, 4, 1)   # Заканчивается в последнее воскресенье октября1410...         self.dston = d - timedelta(days=d.weekday() + 1)1411...         d = datetime(dt.year, 11, 1)1412...         self.dstoff = d - timedelta(days=d.weekday() + 1)1413...     def utcoffset(self, dt):1414...         return timedelta(hours=1) + self.dst(dt)1415...     def dst(self, dt):1416...         if self.dston <=  dt.replace(tzinfo=None) < self.dstoff:1417...             return timedelta(hours=1)1418...         else:1419...             return timedelta(0)1420...     def tzname(self,dt):1421...          return "GMT +1"1422...1423>>> class GMT2(tzinfo):1424...     def __init__(self):1425...         d = datetime(dt.year, 4, 1)1426...         self.dston = d - timedelta(days=d.weekday() + 1)1427...         d = datetime(dt.year, 11, 1)1428...         self.dstoff = d - timedelta(days=d.weekday() + 1)1429...     def utcoffset(self, dt):1430...         return timedelta(hours=1) + self.dst(dt)1431...     def dst(self, dt):1432...         if self.dston <=  dt.replace(tzinfo=None) < self.dstoff:1433...             return timedelta(hours=2)1434...         else:1435...             return timedelta(0)1436...     def tzname(self,dt):1437...         return "GMT +2"1438...1439>>> gmt1 = GMT1()1440>>> # Летнее время1441>>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1)1442>>> dt1.dst()1443datetime.timedelta(0)1444>>> dt1.utcoffset()1445datetime.timedelta(0, 3600)1446>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1)1447>>> dt2.dst()1448datetime.timedelta(0, 3600)1449>>> dt2.utcoffset()1450datetime.timedelta(0, 7200)1451>>> # Преобразовать datetime в другой часовой пояс1452>>> dt3 = dt2.astimezone(GMT2())1453>>> dt3     # doctest: +ELLIPSIS1454datetime.datetime(2006, 6, 14, 14, 0, tzinfo=<GMT2 object at 0x...>)1455>>> dt2     # doctest: +ELLIPSIS1456datetime.datetime(2006, 6, 14, 13, 0, tzinfo=<GMT1 object at 0x...>)1457>>> dt2.utctimetuple() == dt3.utctimetuple()1458True1459```14601461## 8.1.5. [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) Объекты14621463Объект time представляет (местное) время суток, независимо от конкретного дня и может корректироваться с помощью объекта [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo).14641465#### `class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)`14661467Все аргументы необязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами в следующих диапазонах:14681469- `0 <= hour < 24`1470- `0 <= minute < 60`1471- `0 <= секунда < 60`1472- `0 <= микросекунда < 1000000`.14731474Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/3.1/library/exceptions.html#ValueError). Все аргументы по умолчанию равны `0`, за исключением *tzinfo*, который по умолчанию равен [`None`](https://python-all.ru/3.1/library/constants.html#None).14751476Атрибуты класса:14771478#### `time.min`14791480Самое раннее представимое значение14811482[`time`](https://python-all.ru/3.1/library/time.html#time.time)14831484:14851486`time(0, 0, 0, 0)`14871488.14891490#### `time.max`14911492Самое позднее представимое значение14931494[`time`](https://python-all.ru/3.1/library/time.html#time.time)14951496:14971498`time(23, 59, 59, 999999)`14991500.15011502#### `time.resolution`15031504Наименьшая возможная разница между неравными объектами15051506[`time`](https://python-all.ru/3.1/library/time.html#time.time)15071508,15091510`timedelta(microseconds=1)`15111512, однако арифметические операции над объектами15131514[`time`](https://python-all.ru/3.1/library/time.html#time.time)15151516не поддерживаются.15171518Атрибуты экземпляра (только для чтения):15191520#### `time.hour`15211522В диапазоне15231524`range(24)`15251526.15271528#### `time.minute`15291530В диапазоне15311532`range(60)`15331534.15351536#### `time.second`15371538В диапазоне15391540`range(60)`15411542.15431544#### `time.microsecond`15451546В диапазоне15471548`range(1000000)`15491550.15511552#### `time.tzinfo`15531554Объект, переданный в качестве аргумента tzinfo конструктору15551556[`time`](https://python-all.ru/3.1/library/time.html#time.time)15571558, или15591560`None`15611562, если ничего не было передано.15631564Поддерживаемые операции:15651566- сравнение [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) с [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time), при котором *a* считается меньшим, чем *b*, если *a* предшествует *b* во времени. Если один из операндов наивный, а другой осведомлённый, возникает [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError). Если оба операнда осведомлённые и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) игнорируется и сравниваются базовые времена. Если оба операнда осведомлённые и имеют разные атрибуты [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), операнды сначала корректируются вычитанием их смещений UTC (полученных из `self.utcoffset()`). Чтобы предотвратить сравнение объектов разных типов по умолчанию (по адресу объекта), при сравнении объекта [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) с объектом другого типа возникает [`TypeError`](https://python-all.ru/3.1/library/exceptions.html#TypeError), за исключением случаев сравнения на `==` или `!=`. В последних случаях возвращается [`False`](https://python-all.ru/3.1/library/constants.html#False) или [`True`](https://python-all.ru/3.1/library/constants.html#True) соответственно.1567- хэш, использование в качестве ключа словаря1568- эффективная сериализация (pickling)1569- в логических контекстах объект [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) считается истинным тогда и только тогда, когда после преобразования в минуты и вычитания `utcoffset()` (или `0`, если он равен `None`) результат не равен нулю.15701571Методы экземпляра:15721573#### `time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]])`15741575Возвращает объект15761577[`time`](https://python-all.ru/3.1/library/time.html#time.time)15781579с теми же значениями, за исключением тех атрибутов, которым присваиваются новые значения переданными именованными аргументами. Обратите внимание, что15801581`tzinfo=None`15821583можно указать для создания наивного объекта15841585[`time`](https://python-all.ru/3.1/library/time.html#time.time)15861587из осведомлённого15881589[`time`](https://python-all.ru/3.1/library/time.html#time.time)15901591без преобразования временных атрибутов.15921593#### `time.isoformat()`15941595Возвращает строку, представляющую время в формате ISO 8601: HH:MM:SS.mmmmmm или, если self.microsecond равно 0, HH:MM:SS. Если15961597[`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.time.utcoffset)15981599не возвращает16001601`None`16021603, добавляется 6-символьная строка, указывающая смещение UTC в (знаковых) часах и минутах: HH:MM:SS.mmmmmm+HH:MM или, если self.microsecond равно 0, HH:MM:SS+HH:MM.16041605#### `time.__str__()`16061607Для времени16081609*t*16101611вызов16121613`str(t)`16141615эквивалентен16161617`t.isoformat()`16181619.16201621#### `time.strftime(format)`16221623Возвращает строку, представляющую время, управляемую явной строкой формата. См. раздел16241625[*Поведение strftime() и strptime()*](https://python-all.ru/3.1/library/datetime.html#strftime-strptime-behavior)16261627.16281629#### `time.utcoffset()`16301631Если16321633[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)16341635равно16361637`None`16381639, возвращает16401641`None`16421643, иначе возвращает16441645`self.tzinfo.utcoffset(None)`16461647и вызывает исключение, если последний не возвращает16481649`None`16501651или объект16521653[`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)16541655, представляющий целое количество минут с величиной меньше одного дня.16561657#### `time.dst()`16581659Если16601661[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)16621663равно16641665`None`16661667, возвращает16681669`None`16701671, иначе возвращает16721673`self.tzinfo.dst(None)`16741675и вызывает исключение, если последний не возвращает16761677`None`16781679или объект16801681[`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta)16821683, представляющий целое количество минут с величиной меньше одного дня.16841685#### `time.tzname()`16861687Если16881689[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo)16901691равно16921693`None`16941695, возвращает16961697`None`16981699, иначе возвращает17001701`self.tzinfo.tzname(None)`17021703или вызывает исключение, если последний не возвращает17041705`None`17061707или строковый объект.17081709Пример:17101711```python1712>>> from datetime import time, tzinfo1713>>> class GMT1(tzinfo):1714...     def utcoffset(self, dt):1715...         return timedelta(hours=1)1716...     def dst(self, dt):1717...         return timedelta(0)1718...     def tzname(self,dt):1719...         return "Europe/Prague"1720...1721>>> t = time(12, 10, 30, tzinfo=GMT1())1722>>> t                               # doctest: +ELLIPSIS1723datetime.time(12, 10, 30, tzinfo=<GMT1 object at 0x...>)1724>>> gmt = GMT1()1725>>> t.isoformat()1726'12:10:30+01:00'1727>>> t.dst()1728datetime.timedelta(0)1729>>> t.tzname()1730'Europe/Prague'1731>>> t.strftime("%H:%M:%S %Z")1732'12:10:30 Europe/Prague'1733```17341735## 8.1.6. [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) Объекты17361737[`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) – это абстрактный базовый класс, то есть этот класс не следует инстанциировать напрямую. Требуется создать конкретный подкласс и (как минимум) реализовать стандартные методы [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), необходимые для используемых методов [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime). Модуль `datetime` не содержит конкретных подклассов [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo).17381739Экземпляр (конкретного подкласса) [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) может передаваться конструкторам объектов [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time). Последние объекты рассматривают свои атрибуты как местное время, а объект [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) предоставляет методы, раскрывающие смещение местного времени от UTC, название часового пояса и смещение на летнее время – всё относительно переданного им объекта даты или времени.17401741Особое требование для сериализации (pickling): подкласс [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) должен иметь метод [`__init__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__init__), который можно вызвать без аргументов, иначе его можно сериализовать, но, возможно, нельзя будет десериализовать. Это техническое требование, которое может быть смягчено в будущем.17421743Конкретному подклассу [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) может потребоваться реализовать следующие методы. Какие именно методы необходимы, зависит от того, как используются осведомлённые объекты `datetime`. В случае сомнений достаточно реализовать все.17441745#### `tzinfo.utcoffset(self, dt)`17461747Возвращает смещение локального времени от UTC в минутах к востоку от UTC. Если локальное время западнее UTC, значение должно быть отрицательным. Обратите внимание, что это полное смещение от UTC; например, если объект [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) представляет как часовой пояс, так и поправки на летнее время, [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.utcoffset) должен возвращать их сумму. Если смещение UTC неизвестно, вернуть `None`. Иначе возвращаемое значение должно быть объектом [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta), задающим целое количество минут в диапазоне от -1439 до 1439 включительно (1440 = 24\*60; величина смещения должна быть меньше одного дня). Большинство реализаций [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.utcoffset), вероятно, будут выглядеть как один из этих двух вариантов:17481749```python1750return CONSTANT                 # класс с фиксированным смещением1751return CONSTANT + self.dst(dt)  # класс, учитывающий летнее время1752```17531754Если [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.utcoffset) не возвращает `None`, [`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.dst) также не должен возвращать `None`.17551756Реализация по умолчанию [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.utcoffset) вызывает [`NotImplementedError`](https://python-all.ru/3.1/library/exceptions.html#NotImplementedError).17571758#### `tzinfo.dst(self, dt)`17591760Возвращает поправку на летнее время (DST) в минутах к востоку от UTC или `None`, если информация о DST неизвестна. Возвращает `timedelta(0)`, если DST не действует. Если DST действует, возвращает смещение в виде объекта [`timedelta`](https://python-all.ru/3.1/library/datetime.html#datetime.timedelta) (подробнее см. [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.utcoffset)). Обратите внимание, что смещение DST, если применимо, уже добавлено к смещению UTC, возвращаемому [`utcoffset()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.utcoffset), поэтому нет необходимости обращаться к [`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.dst), если только не требуется получить информацию о DST отдельно. Например, [`datetime.timetuple()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.timetuple) вызывает метод [`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.dst) своего атрибута [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), чтобы определить, как должен быть установлен флаг `tm_isdst`, а [`tzinfo.fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc) вызывает [`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.dst) для учёта изменений DST при пересечении часовых поясов.17611762Экземпляр *tz* подкласса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), который моделирует как стандартное, так и летнее время, должен быть согласован в следующем смысле:17631764`tz.utcoffset(dt) - tz.dst(dt)`17651766должно возвращать один и тот же результат для каждого [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) *dt* с `dt.tzinfo == tz`. Для разумных подклассов [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) это выражение даёт «стандартное смещение» часового пояса, которое не должно зависеть от даты или времени, а только от географического положения. Реализация [`datetime.astimezone()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.astimezone) полагается на это, но не может обнаружить нарушения; это обязанность программиста обеспечить это. Если подкласс [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) не может гарантировать это, он может переопределить реализацию по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc), чтобы он корректно работал с `astimezone()` в любом случае.17671768Большинство реализаций [`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.dst), вероятно, будут выглядеть как один из этих двух вариантов:17691770```python1771def dst(self):1772    # класс с фиксированным смещением: не учитывает летнее время1773    return timedelta(0)1774```17751776или17771778```python1779def dst(self):1780    # Код для установки dston и dstoff в значения летнего времени часового пояса1781    # переходные моменты времени на основе входного dt.year и выраженные1782    # в стандартном местном времени.  Затем17831784    if dston <= dt.replace(tzinfo=None) < dstoff:1785        return timedelta(hours=1)1786    else:1787        return timedelta(0)1788```17891790Реализация по умолчанию [`dst()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.dst) вызывает [`NotImplementedError`](https://python-all.ru/3.1/library/exceptions.html#NotImplementedError).17911792#### `tzinfo.tzname(self, dt)`17931794Возвращает название часового пояса, соответствующее объекту [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) *dt*, в виде строки. Модуль `datetime` не определяет никаких правил для строковых названий, и нет требования, чтобы они что-то конкретное означали. Например, «GMT», «UTC», «-500», «-5:00», «EDT», «US/Eastern», «America/New York» – все это допустимые ответы. Возвращает `None`, если строковое название неизвестно. Обратите внимание, что это метод, а не фиксированная строка, в первую очередь потому, что некоторые подклассы [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) могут возвращать разные названия в зависимости от конкретного значения переданного *dt*, особенно если класс [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) учитывает летнее время.17951796Реализация по умолчанию [`tzname()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.tzname) вызывает [`NotImplementedError`](https://python-all.ru/3.1/library/exceptions.html#NotImplementedError).17971798Эти методы вызываются объектом [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) или [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) в ответ на их методы с теми же именами. Объект [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) передаёт себя в качестве аргумента, а объект [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) передаёт `None` в качестве аргумента. Таким образом, методы подкласса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) должны быть готовы принять аргумент *dt*, который может быть `None` или объектом класса [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime).17991800Когда передаётся `None`, разработчик класса решает, как лучше ответить. Например, возврат `None` уместен, если класс хочет указать, что объекты времени не участвуют в протоколах [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo). Возможно, будет полезнее, чтобы `utcoffset(None)` возвращал стандартное смещение UTC, поскольку нет другого способа узнать стандартное смещение.18011802Когда объект [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) передаётся в ответ на метод [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime), `dt.tzinfo` является тем же объектом, что и *self*. Методы [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) могут полагаться на это, если только пользовательский код не вызывает методы [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) напрямую. Предполагается, что методы [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) интерпретируют *dt* как локальное время и не должны беспокоиться об объектах в других часовых поясах.18031804Существует ещё один метод [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), который подкласс может захотеть переопределить:18051806#### `tzinfo.fromutc(self, dt)`18071808Этот метод вызывается из реализации по умолчанию [`datetime.astimezone()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.astimezone). При вызове оттуда `dt.tzinfo` равно *self*, а атрибуты даты и времени *dt* должны рассматриваться как представляющие время UTC. Назначение [`fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc) – скорректировать атрибуты даты и времени, вернув эквивалентный datetime в местном времени *self*.18091810Большинство подклассов [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) могут без проблем наследовать реализацию по умолчанию [`fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc). Она достаточно сильна, чтобы обрабатывать часовые пояса с фиксированным смещением и часовые пояса, учитывающие как стандартное, так и летнее время, причём последние даже если время перехода на летнее время различается в разные годы. Пример часового пояса, с которым реализация по умолчанию [`fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc) может не справиться корректно во всех случаях, – это пояс, где стандартное смещение (от UTC) зависит от конкретной переданной даты и времени, что может происходить по политическим причинам. Реализации по умолчанию `astimezone()` и [`fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc) могут не дать желаемый результат, если результат приходится на один из часов, пересекающих момент изменения стандартного смещения.18111812Если не рассматривать код для обработки ошибок, реализация [`fromutc()`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo.fromutc) по умолчанию действует следующим образом:18131814```python1815def fromutc(self, dt):1816    # вызывает ошибку ValueError, если dt.tzinfo не равен self1817    dtoff = dt.utcoffset()1818    dtdst = dt.dst()1819    # вызывает ValueError, если dtoff или dtdst равны None1820    delta = dtoff - dtdst  # это стандартное смещение self1821    if delta:1822        dt += delta   # преобразовать в стандартное местное время1823        dtdst = dt.dst()1824        # вызывает ValueError, если dtdst равен None1825    if dtdst:1826        return dt + dtdst1827    else:1828        return dt1829```18301831Примеры классов [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo):18321833```python1834from datetime import tzinfo, timedelta, datetime18351836ZERO = timedelta(0)1837HOUR = timedelta(hours=1)18381839# Класс UTC.18401841class UTC(tzinfo):1842    """UTC"""18431844    def utcoffset(self, dt):1845        return ZERO18461847    def tzname(self, dt):1848        return "UTC"18491850    def dst(self, dt):1851        return ZERO18521853utc = UTC()18541855# Класс, создающий объекты tzinfo для часовых поясов с фиксированным смещением.1856# Обратите внимание, что FixedOffset(0, "UTC") – это другой способ построения1857# Объект tzinfo UTC.18581859class FixedOffset(tzinfo):1860    """Фиксированное смещение в минутах к востоку от UTC."""18611862    def __init__(self, offset, name):1863        self.__offset = timedelta(minutes = offset)1864        self.__name = name18651866    def utcoffset(self, dt):1867        return self.__offset18681869    def tzname(self, dt):1870        return self.__name18711872    def dst(self, dt):1873        return ZERO18741875# Класс, отражающий представление платформы о местном времени.18761877import time as _time18781879STDOFFSET = timedelta(seconds = -_time.timezone)1880if _time.daylight:1881    DSTOFFSET = timedelta(seconds = -_time.altzone)1882else:1883    DSTOFFSET = STDOFFSET18841885DSTDIFF = DSTOFFSET - STDOFFSET18861887class LocalTimezone(tzinfo):18881889    def utcoffset(self, dt):1890        if self._isdst(dt):1891            return DSTOFFSET1892        else:1893            return STDOFFSET18941895    def dst(self, dt):1896        if self._isdst(dt):1897            return DSTDIFF1898        else:1899            return ZERO19001901    def tzname(self, dt):1902        return _time.tzname[self._isdst(dt)]19031904    def _isdst(self, dt):1905        tt = (dt.year, dt.month, dt.day,1906              dt.hour, dt.minute, dt.second,1907              dt.weekday(), 0, 0)1908        stamp = _time.mktime(tt)1909        tt = _time.localtime(stamp)1910        return tt.tm_isdst > 019111912Local = LocalTimezone()19131914# Полная реализация текущих правил летнего времени для основных часовых поясов США.19151916def first_sunday_on_or_after(dt):1917    days_to_go = 6 - dt.weekday()1918    if days_to_go:1919        dt += timedelta(days_to_go)1920    return dt19211922# Правила летнего времени в США1923#1924# Это упрощённый набор правил для США (т.е. неверный для некоторых случаев)1925# времени начала и окончания летнего времени. Полный и актуальный набор правил летнего времени1926# и определений часовых поясов смотрите в базе данных Olson (или попробуйте pytz):1927# http://www.twinsun.com/tz/tz-link.htm1928# http://sourceforge.net/projects/pytz/ (возможно, неактуально)1929#1930# В США с 2007 года летнее время начинается в 2 часа ночи (стандартное время) во второе1931# воскресенье марта, то есть первое воскресенье 8 марта или после него.1932DSTSTART_2007 = datetime(1, 3, 8, 2)1933# и заканчивается в 2 часа ночи (по летнему времени; 1 час ночи по стандартному времени) в первое воскресенье ноября.1934DSTEND_2007 = datetime(1, 11, 1, 1)1935# С 1987 по 2006 год летнее время начиналось в 2 часа ночи (стандартное время) в первое1936# воскресенье в апреле и заканчиваться в 2 часа ночи (по летнему времени; 1 час ночи по стандартному времени) в последнее1937# воскресенье октября, то есть первое воскресенье 25 октября или после него.1938DSTSTART_1987_2006 = datetime(1, 4, 1, 2)1939DSTEND_1987_2006 = datetime(1, 10, 25, 1)1940# С 1967 по 1986 год летнее время начиналось в 2 часа ночи (стандартное время) в последнее1941# воскресенье апреля (то, которое приходится на 24 апреля или позже) и заканчиваться в 2 часа ночи (по летнему времени;1942# 1 час ночи по стандартному времени) в последнее воскресенье октября, которое является первым воскресеньем1943# 25 октября или позднее.1944DSTSTART_1967_1986 = datetime(1, 4, 24, 2)1945DSTEND_1967_1986 = DSTEND_1987_200619461947class USTimeZone(tzinfo):19481949    def __init__(self, hours, reprname, stdname, dstname):1950        self.stdoffset = timedelta(hours=hours)1951        self.reprname = reprname1952        self.stdname = stdname1953        self.dstname = dstname19541955    def __repr__(self):1956        return self.reprname19571958    def tzname(self, dt):1959        if self.dst(dt):1960            return self.dstname1961        else:1962            return self.stdname19631964    def utcoffset(self, dt):1965        return self.stdoffset + self.dst(dt)19661967    def dst(self, dt):1968        if dt is None or dt.tzinfo is None:1969            # В одном или обоих случаях здесь может быть уместно исключение.1970            # Это зависит от того, как вы хотите их обрабатывать. Реализация по умолчанию1971            # fromutc() (вызываемая реализацией astimezone() по умолчанию)1972            # реализация) передаёт datetime с dt.tzinfo равным self.1973            return ZERO1974        assert dt.tzinfo is self19751976        # Найти время начала и окончания перехода на летнее время в США. Для лет до 1967 года вернуть1977        # ZERO – если переход на летнее время не применяется.1978        if 2006 < dt.year:1979            dststart, dstend = DSTSTART_2007, DSTEND_20071980        elif 1986 < dt.year < 2007:1981            dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_20061982        elif 1966 < dt.year < 1987:1983            dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_19861984        else:1985            return ZERO19861987        start = first_sunday_on_or_after(dststart.replace(year=dt.year))1988        end = first_sunday_on_or_after(dstend.replace(year=dt.year))19891990        # Нельзя сравнивать наивные и осведомлённые объекты, поэтому сначала удалите часовой пояс из1991        # сначала dt.1992        if start <= dt.replace(tzinfo=None) < end:1993            return HOUR1994        else:1995            return ZERO19961997Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")1998Central  = USTimeZone(-6, "Central",  "CST", "CDT")1999Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")2000Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")2001```20022003Обратите внимание, что дважды в год в подклассе [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo), учитывающем как стандартное, так и летнее время, возникают неизбежные тонкости в точках перехода на летнее время. Для конкретики рассмотрим восточное время США (UTC -0500), где летнее время (EDT) начинается через минуту после 1:59 (EST) во второе воскресенье марта и заканчивается через минуту после 1:59 (EDT) в первое воскресенье ноября:20042005```python2006  UTC   3:MM  4:MM  5:MM  6:MM  7:MM  8:MM2007  EST  22:MM 23:MM  0:MM  1:MM  2:MM  3:MM2008  EDT  23:MM  0:MM  1:MM  2:MM  3:MM  4:MM20092010start  22:MM 23:MM  0:MM  1:MM  3:MM  4:MM20112012  end  23:MM  0:MM  1:MM  1:MM  2:MM  3:MM2013```20142015Когда начинается летнее время (строка «start»), местные настенные часы перескакивают с 1:59 на 3:00. Время вида 2:MM в этот день не имеет смысла, поэтому `astimezone(Eastern)` не вернёт результат с `hour == 2` в день начала DST. Чтобы `astimezone()` могла дать такую гарантию, метод `rzinfo.dst()` должен считать время в «пропущенном часе» (2:MM для Eastern) летним временем.20162017Когда летнее время заканчивается (строка «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.1/library/datetime.html#datetime.tzinfo.dst) должен считать время в «повторяющемся часе» стандартным. Этого легко добиться, как в примере, выражая моменты перехода DST в стандартном местном времени часового пояса.20182019Приложения, которые не терпят таких неоднозначностей, должны избегать использования гибридных подклассов [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo); неоднозначностей нет при использовании UTC или любого другого подкласса [`tzinfo`](https://python-all.ru/3.1/library/datetime.html#datetime.tzinfo) с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов) или только EDT (фиксированное смещение -4 часа)).20202021## 8.1.7. Поведение `strftime()` и `strptime()`20222023Объекты [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) поддерживают метод `strftime(format)` для создания строки, представляющей время в соответствии с заданной строкой формата. В общем, `d.strftime(fmt)` действует как функция `time.strftime(fmt, d.timetuple())` из модуля [`time`](https://python-all.ru/3.1/library/time.html#module-time), хотя не все объекты поддерживают метод `timetuple()`.20242025И наоборот, метод класса [`datetime.strptime()`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime.strptime) создаёт объект [`datetime`](https://python-all.ru/3.1/library/datetime.html#datetime.datetime) из строки, представляющей дату и время, и соответствующей строки формата. `datetime.strptime(date_string, format)` эквивалентно `datetime(*(time.strptime(date_string, format)[0:6]))`.20262027Для объектов [`time`](https://python-all.ru/3.1/library/datetime.html#datetime.time) коды формата для года, месяца и дня не должны использоваться, поскольку объекты time не содержат таких значений. Если они всё же используются, `1900` подставляется для года, а `1` для месяца и дня.20282029Для объектов [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) коды формата для часов, минут, секунд и микросекунд не должны использоваться, поскольку объекты [`date`](https://python-all.ru/3.1/library/datetime.html#datetime.date) не содержат таких значений. Если они всё же используются, `0` подставляется вместо них.20302031Для наивного объекта коды форматирования `%z` и `%Z` заменяются пустыми строками.20322033Для осведомлённого объекта:20342035**`%z`**20362037`utcoffset()`20382039преобразуется в строку из 5 символов вида +HHMM или -HHMM, где HH – двузначная строка, указывающая количество часов смещения UTC, а MM – двузначная строка, указывающая количество минут смещения UTC. Например, если20402041`utcoffset()`20422043возвращает20442045`timedelta(hours=-3, minutes=-30)`20462047, то20482049`%z`20502051заменяется строкой20522053`'-0330'`20542055.20562057**`%Z`**20582059Если20602061`tzname()`20622063возвращает20642065`None`20662067, то20682069`%Z`20702071заменяется пустой строкой. В противном случае20722073`%Z`20742075заменяется возвращённым значением, которое должно быть строкой.20762077Полный набор поддерживаемых кодов формата зависит от платформы, поскольку Python вызывает функцию `strftime()` из библиотеки C данной платформы, а различия между платформами – обычное дело.20782079Ниже приведён список всех кодов формата, которые требуются стандартом C (версии 1989 года), и они работают на всех платформах со стандартной реализацией C. Обратите внимание, что версия 1999 года стандарта C добавила дополнительные коды формата.20802081Точный диапазон лет, для которых работает `strftime()`, также различается на разных платформах. Независимо от платформы, годы до 1900 использовать нельзя.20822083| Директива | Значение | Примечания |2084| --- | --- | --- |2085| `%a` | Сокращённое название дня недели в соответствии с локалью. |  |2086| `%A` | Полное название дня недели в соответствии с локалью. |  |2087| `%b` | Сокращённое название месяца в соответствии с локалью. |  |2088| `%B` | Полное название месяца в соответствии с локалью. |  |2089| `%c` | Представление даты и времени, подходящее для локали. |  |2090| `%d` | День месяца в виде десятичного числа \[01,31\]. |  |2091| `%f` | Микросекунды в виде десятичного числа \[0,999999\], с дополнением нулями слева. | (1) |2092| `%H` | Часы (24-часовой формат) в виде десятичного числа \[00,23\]. |  |2093| `%I` | Часы (12-часовой формат) в виде десятичного числа \[01,12\]. |  |2094| `%j` | День года в виде десятичного числа \[001,366\]. |  |2095| `%m` | Месяц в виде десятичного числа \[01,12\]. |  |2096| `%M` | Минуты в виде десятичного числа \[00,59\]. |  |2097| `%p` | Эквивалент AM или PM, зависящий от локали. | (2) |2098| `%S` | Секунды в виде десятичного числа \[00,61\]. | (3) |2099| `%U` | Номер недели в году (воскресенье – первый день недели) в виде десятичного числа \[00,53\]. Все дни нового года до первого воскресенья считаются частью недели 0. | (4) |2100| `%w` | День недели в виде десятичного числа \[0 (воскресенье), 6\]. |  |2101| `%W` | Номер недели в году (понедельник – первый день недели) в виде десятичного числа \[00,53\]. Все дни нового года до первого понедельника считаются частью недели 0. | (4) |2102| `%x` | Представление даты, соответствующее локали. |  |2103| `%X` | Представление времени, соответствующее локали. |  |2104| `%y` | Год без века в виде десятичного числа \[00,99\]. |  |2105| `%Y` | Год со столетием в виде десятичного числа. |  |2106| `%z` | Смещение UTC в формате +HHMM или -HHMM (пустая строка, если объект наивный). | (5) |2107| `%Z` | Название часового пояса (пустая строка, если объект наивный). |  |2108| `%%` | Литеральный символ `'%'`. |  |21092110Примечания:211121121. При использовании с методом `strptime()` директива `%f` принимает от одной до шести цифр и дополняет нулями справа. `%f` является расширением набора символов форматирования в стандарте C (но реализовано отдельно в объектах datetime, и поэтому всегда доступно).21132. При использовании с методом `strptime()` директива `%p` влияет на поле часа на выходе только если директива `%I` используется для разбора часа.21143. Диапазон действительно равен от `0` до `61`; согласно стандарту Posix, это учитывает високосные секунды и (очень редкие) двойные високосные секунды. Модуль [`time`](https://python-all.ru/3.1/library/time.html#module-time) может генерировать и принимает високосные секунды, поскольку он основан на стандарте Posix, но модуль `datetime` не принимает високосные секунды во входных данных `strptime()` и не будет генерировать их в выводе `strftime()`.21154. При использовании с методом `strptime()` директивы `%U` и `%W` используются только в вычислениях, когда указаны день недели и год.21165. Например, если `utcoffset()` возвращает `timedelta(hours=-3, minutes=-30)`, то `%z` заменяется строкой `'-0330'`.2117