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

datetime.md

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

1> **Источник:** https://python-all.ru/2.7/library/datetime.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.1. [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) – Базовые типы даты и времени89Новое в версии 2.3.1011Модуль [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) предоставляет классы для работы с датами и временем как простыми, так и сложными способами. Хотя арифметика дат и времени поддерживается, основное внимание в реализации уделяется эффективному извлечению атрибутов для форматирования вывода и манипуляции. За дополнительными возможностями обращайтесь также к модулям [`time`](https://python-all.ru/2.7/library/time.html#module-time) и [`calendar`](https://python-all.ru/2.7/library/calendar.html#module-calendar).1213Существует два вида объектов даты и времени: «наивные» (naive) и «осведомлённые» (aware).1415Осведомлённый объект обладает достаточными знаниями о применимых алгоритмических и политических корректировках времени, таких как информация о часовом поясе и переходе на летнее время, чтобы определить своё положение относительно других осведомлённых объектов. Осведомлённый объект используется для представления конкретного момента времени, не допускающего неоднозначного толкования [1](https://python-all.ru/2.7/library/datetime.html#id2).1617Наивный объект не содержит достаточной информации, чтобы однозначно определить своё положение относительно других объектов даты/времени. Представляет ли наивный объект всемирное координированное время (UTC), местное время или время в другом часовом поясе, полностью зависит от программы, точно так же, как зависит от программы, обозначает ли конкретное число метры, мили или массу. Наивными объектами легко пользоваться и легко с ними работать, но за счёт игнорирования некоторых аспектов реальности.1819Для приложений, которым требуются осведомлённые объекты, объекты [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) имеют необязательный атрибут информации о часовом поясе `tzinfo`, который может быть задан экземпляром подкласса абстрактного класса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo). Эти объекты [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) содержат информацию о смещении от UTC, названии часового пояса и о том, действует ли летнее время. Обратите внимание, что модуль [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) не предоставляет конкретных классов [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo). Поддержка часовых поясов на любом необходимом уровне детализации остаётся на усмотрение приложения. Правила корректировки времени по всему миру больше политические, чем рациональные, и не существует единого стандарта, подходящего для любого приложения.2021Модуль [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) экспортирует следующие константы:2223#### `datetime.MINYEAR`2425Наименьший номер года, допустимый в объекте [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). [`MINYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MINYEAR) равен `1`.2627#### `datetime.MAXYEAR`2829Наибольший номер года, допустимый в объекте [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) или [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). [`MAXYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MAXYEAR) равен `9999`.3031> **См. также**32>33> **Модуль [`calendar`](https://python-all.ru/2.7/library/calendar.html#module-calendar)**34>35> Общие функции, связанные с календарём.36>37> **Модуль [`time`](https://python-all.ru/2.7/library/time.html#module-time)**38>39> Доступ к времени и преобразования.4041## 8.1.1. Доступные типы4243#### `class datetime.date`4445Идеализированная наивная дата, предполагающая, что текущий григорианский календарь действовал всегда и будет действовать всегда. Атрибуты: [`year`](https://python-all.ru/2.7/library/datetime.html#datetime.date.year), [`month`](https://python-all.ru/2.7/library/datetime.html#datetime.date.month) и [`day`](https://python-all.ru/2.7/library/datetime.html#datetime.date.day).4647#### `class datetime.time`4849Идеализированное время, не зависящее от какого-либо конкретного дня, при условии, что каждый день состоит ровно из 24\*60\*60 секунд (понятие «високосных секунд» здесь отсутствует). Атрибуты: [`hour`](https://python-all.ru/2.7/library/datetime.html#datetime.time.hour), [`minute`](https://python-all.ru/2.7/library/datetime.html#datetime.time.minute), [`second`](https://python-all.ru/2.7/library/datetime.html#datetime.time.second), [`microsecond`](https://python-all.ru/2.7/library/datetime.html#datetime.time.microsecond) и [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.time.tzinfo).5051#### `class datetime.datetime`5253Комбинация даты и времени. Атрибуты: [`year`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.year), [`month`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.month), [`day`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.day), [`hour`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.hour), [`minute`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.minute), [`second`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.second), [`microsecond`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.microsecond), и [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo).5455#### `class datetime.timedelta`5657Продолжительность, выражающая разницу между двумя экземплярами [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date), [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) с точностью до микросекунды.5859#### `class datetime.tzinfo`6061Абстрактный базовый класс для объектов информации о часовом поясе. Они используются классами [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) для предоставления настраиваемого понятия корректировки времени (например, для учёта часового пояса и/или летнего времени).6263Объекты этих типов неизменяемы.6465Объекты типа [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) всегда naive.6667Объект типа [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) или [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) может быть наивным или осведомлённым. Объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) *d* является осведомлённым, если `d.tzinfo` не равно `None` и `d.tzinfo.utcoffset(d)` не возвращает `None`. Если `d.tzinfo` равно `None`, или если `d.tzinfo` не равно `None`, но `d.tzinfo.utcoffset(d)` возвращает `None`, то *d* является наивным. Объект [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) *t* является осведомлённым, если `t.tzinfo` не равно `None` и `t.tzinfo.utcoffset(None)` не возвращает `None`. В противном случае *t* является наивным.6869Различие между наивными и осведомлёнными не применяется к объектам [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta).7071Отношения подклассов:7273```python74object75    timedelta76    tzinfo77    time78    date79        datetime80```8182## 8.1.2. [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) Объекты8384Объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) представляет собой продолжительность, то есть разницу между двумя датами или моментами времени.8586#### `class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])`8788Все аргументы необязательны и по умолчанию равны `0`. Аргументы могут быть целыми числами (int), длинными целыми числами (long) или числами с плавающей запятой (float), а также положительными или отрицательными.8990Внутри хранятся только *days*, *seconds* и *microseconds*. Аргументы преобразуются в эти единицы:9192- Миллисекунда преобразуется в 1000 микросекунд.93- Минута преобразуется в 60 секунд.94- Час преобразуется в 3600 секунд.95- Неделя преобразуется в 7 дней.9697а затем дни, секунды и микросекунды нормализуются так, что представление уникально, с9899- `0 <= microseconds < 1000000`100- `0 <= seconds < 3600*24` (количество секунд в одном дне)101- `-999999999 <= days <= 999999999`102103Если какой-либо аргумент является числом с плавающей запятой и есть дробные микросекунды, дробные микросекунды, оставшиеся от всех аргументов, объединяются и их сумма округляется до ближайшей микросекунды. Если ни один аргумент не является числом с плавающей запятой, процессы преобразования и нормализации являются точными (информация не теряется).104105Если нормализованное значение дней выходит за указанный диапазон, возбуждается [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError).106107Обратите внимание, что нормализация отрицательных значений может сначала показаться неожиданной. Например,108109```python110>>> from datetime import timedelta111>>> d = timedelta(microseconds=-1)112>>> (d.days, d.seconds, d.microseconds)113(-1, 86399, 999999)114```115116Атрибуты класса:117118#### `timedelta.min`119120Наиболее отрицательный объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), `timedelta(-999999999)`.121122#### `timedelta.max`123124Наиболее положительный объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), `timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)`.125126#### `timedelta.resolution`127128Наименьшая возможная разница между неравными [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) объектами, `timedelta(microseconds=1)`.129130Обратите внимание, что из-за нормализации `timedelta.max` \> `-timedelta.min`. `-timedelta.max` не представим как объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta).131132Атрибуты экземпляра (только для чтения):133134| Атрибут | Значение |135| --- | --- |136| `days` | От -999999999 до 999999999 включительно |137| `seconds` | От 0 до 86399 включительно |138| `microseconds` | От 0 до 999999 включительно |139140Поддерживаемые операции:141142| Операция | Результат |143| --- | --- |144| `t1 = t2 + t3` | Сумма *t2* и *t3*. После этого *t1*-*t2* == *t3* и *t1*-*t3* == *t2* истинны. (1) |145| `t1 = t2 - t3` | Разность *t2* и *t3*. После этого *t1* == *t2* - *t3* и *t2* == *t1* + *t3* истинны. (1) |146| `t1 = t2 * i or t1 = i * t2` | Дельта, умноженная на целое число или long. После этого *t1* // i == *t2* истинно, при условии `i != 0`. |147|  | В общем случае, *t1* \* i == *t1* \* (i-1) + *t1* является истинным. (1) |148| `t1 = t2 // i` | Вычисляется целая часть от деления, а остаток (если есть) отбрасывается. (3) |149| `+t1` | Возвращает объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) с тем же значением. (2) |150| `-t1` | эквивалентно [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta)(-*t1.days*, -*t1.seconds*, -*t1.microseconds*) и *t1*\* -1. (1)(4) |151| `abs(t)` | эквивалентно +*t*, когда `t.days >= 0`, и -*t*, когда `t.days < 0`. (2) |152| `str(t)` | Возвращает строку вида `[D day[s], ][H]H:MM:SS[.UUUUUU]`, где D отрицательно для отрицательного `t`. (5) |153| `repr(t)` | Возвращает строку вида `datetime.timedelta(D[, S[, U]])`, где D отрицательно для отрицательного `t`. (5) |154155Примечания:1561571. Это точное вычисление, но может произойти переполнение.1582. Это точное вычисление и не может вызвать переполнение.1593. Деление на 0 вызывает исключение [`ZeroDivisionError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ZeroDivisionError).1604. -*timedelta.max* не представимо в виде объекта [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta).1615. Строковые представления объектов [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных объектов timedelta. Например:162163   ```python164   >>> timedelta(hours=-5)165   datetime.timedelta(-1, 68400)166   >>> print(_)167   -1 day, 19:00:00168   ```169170В дополнение к операциям, перечисленным выше, объекты [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) поддерживают определённые сложения и вычитания с объектами [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) и [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) (см. ниже).171172Поддерживается сравнение объектов [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), при этом объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), представляющий меньшую продолжительность, считается меньшим timedelta. Чтобы предотвратить возврат к сравнению по умолчанию по адресу объекта при сравнении разнотипных объектов, при сравнении объекта [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) с объектом другого типа вызывается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращается [`False`](https://python-all.ru/2.7/library/constants.html#False) или [`True`](https://python-all.ru/2.7/library/constants.html#True) соответственно.173174Объекты [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) являются [хешируемыми](https://python-all.ru/2.7/glossary.html#term-hashable) (могут использоваться в качестве ключей словаря), поддерживают эффективную сериализацию и в логическом контексте объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) считается истинным тогда и только тогда, когда он не равен `timedelta(0)`.175176Методы экземпляра:177178#### `timedelta.total_seconds()`179180Возвращает общее количество секунд, содержащихся в длительности. Эквивалентно `(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6`, вычисленному с включённым истинным делением.181182Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет точность до микросекунд.183184Новое в версии 2.7.185186Пример использования:187188```python189>>> from datetime import timedelta190>>> year = timedelta(days=365)191>>> another_year = timedelta(weeks=40, days=84, hours=23,192...                          minutes=50, seconds=600)  # составляет 365 дней193>>> year.total_seconds()19431536000.0195>>> year == another_year196True197>>> ten_years = 10 * year198>>> ten_years, ten_years.days // 365199(datetime.timedelta(3650), 10)200>>> nine_years = ten_years - year201>>> nine_years, nine_years.days // 365202(datetime.timedelta(3285), 9)203>>> three_years = nine_years // 3;204>>> three_years, three_years.days // 365205(datetime.timedelta(1095), 3)206>>> abs(three_years - ten_years) == 2 * three_years + year207True208```209210## 8.1.3. [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) Объекты211212Объект [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) представляет дату (год, месяц и день) в идеализированном календаре – текущем григорианском календаре, бесконечно расширенном в обоих направлениях. 1 января 1 года называется днём номер 1, 2 января 1 года – днём номер 2 и так далее. Это соответствует определению «пролептического григорианского» календаря в книге Дершовица и Рейнгольда «Календарные вычисления», где он является базовым календарём для всех вычислений. За алгоритмами преобразования между пролептическими григорианскими порядковыми номерами и многими другими календарными системами обращайтесь к этой книге.213214#### `class datetime.date(year, month, day)`215216Все аргументы обязательны. Аргументы могут быть целыми числами (int) или длинными целыми числами (long) в следующих диапазонах:217218- `MINYEAR <= year <= MAXYEAR`219- `1 <= month <= 12`220- `1 <= day <= number of days in the given month and year`221222Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError).223224Другие конструкторы – все методы класса:225226#### `classmethod date.today()`227228Возвращает текущую локальную дату. Это эквивалентно `date.fromtimestamp(time.time())`.229230#### `classmethod date.fromtimestamp(timestamp)`231232Возвращает локальную дату, соответствующую метке времени POSIX, например, возвращаемой [`time.time()`](https://python-all.ru/2.7/library/time.html#time.time). Может вызвать [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), если метка времени выходит за диапазон значений, поддерживаемых функцией `localtime()` языка C платформы. Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах, не являющихся POSIX, которые включают високосные секунды в своё понятие метки времени, високосные секунды игнорируются [`fromtimestamp()`](https://python-all.ru/2.7/library/datetime.html#datetime.date.fromtimestamp).233234#### `classmethod date.fromordinal(ordinal)`235236Возвращает дату, соответствующую пролептическому григорианскому порядковому номеру, где 1 января года 1 имеет порядковый номер 1. [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) возбуждается, если не `1 <= ordinal <= date.max.toordinal()`. Для любой даты *d*, `date.fromordinal(d.toordinal()) == d`.237238Атрибуты класса:239240#### `date.min`241242Самая ранняя представимая дата, `date(MINYEAR, 1, 1)`.243244#### `date.max`245246Самая поздняя представимая дата, `date(MAXYEAR, 12, 31)`.247248#### `date.resolution`249250Наименьшая возможная разница между неравными объектами дат, `timedelta(days=1)`.251252Атрибуты экземпляра (только для чтения):253254#### `date.year`255256От [`MINYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MAXYEAR) включительно.257258#### `date.month`259260От 1 до 12 включительно.261262#### `date.day`263264От 1 до количества дней в указанном месяце указанного года.265266Поддерживаемые операции:267268| Операция | Результат |269| --- | --- |270| `date2 = date1 + timedelta` | *date2* отстоит на `timedelta.days` дней от *date1*. (1) |271| `date2 = date1 - timedelta` | Вычисляет *date2* так, что `date2 + timedelta == date1`. (2) |272| `timedelta = date1 - date2` | (3) |273| `date1 < date2` | *date1* считается меньше *date2*, если *date1* предшествует *date2* во времени. (4) |274275Примечания:2762771. *date2* перемещается вперед по времени, если `timedelta.days > 0`, или назад, если `timedelta.days < 0`. После этого `date2 - date1 == timedelta.days`. `timedelta.seconds` и `timedelta.microseconds` игнорируются. [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError) возбуждается, если `date2.year` будет меньше [`MINYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MAXYEAR).2782. Это не совсем эквивалентно date1 + (-timedelta), потому что -timedelta сам по себе может вызвать переполнение в тех случаях, когда date1 - timedelta его не вызывает. `timedelta.seconds` и `timedelta.microseconds` игнорируются.2793. Это точная операция и не может вызвать переполнение. timedelta.seconds и timedelta.microseconds равны 0, и после этого date2 + timedelta == date1.2804. Иначе говоря, `date1 < date2` тогда и только тогда, когда `date1.toordinal() < date2.toordinal()`. Чтобы сравнение не переходило к стандартному механизму сравнения адресов объектов, сравнение дат обычно вызывает [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError), если другой операнд не является объектом [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date). Однако вместо этого возвращается `NotImplemented`, если другой операнд имеет атрибут `timetuple()`. Этот хук даёт другим видам объектов даты возможность реализовать сравнение смешанных типов. Если нет, то при сравнении объекта [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) с объектом другого типа вызывается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращаются соответственно [`False`](https://python-all.ru/2.7/library/constants.html#False) или [`True`](https://python-all.ru/2.7/library/constants.html#True).281282Даты можно использовать в качестве ключей словаря. В логическом контексте все объекты [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) считаются истинными.283284Методы экземпляра:285286#### `date.replace(year, month, day)`287288Возвращает дату с теми же значениями, за исключением параметров, которым присваиваются новые значения указанными именованными аргументами. Например, если `d == date(2002, 12, 31)`, то `d.replace(day=26) == date(2002, 12, 26)`.289290#### `date.timetuple()`291292Возвращает [`time.struct_time`](https://python-all.ru/2.7/library/time.html#time.struct_time), аналогичный возвращаемому [`time.localtime()`](https://python-all.ru/2.7/library/time.html#time.localtime). Часы, минуты и секунды равны 0, а флаг DST равен −1. `d.timetuple()` эквивалентен `time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))`, где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – номер дня в текущем году, начиная с `1` для 1 января.293294#### `date.toordinal()`295296Возвращает пролептический григорианский порядковый номер даты, где 1 января года 1 имеет номер 1. Для любого объекта [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) *d*, `date.fromordinal(d.toordinal()) == d`.297298#### `date.weekday()`299300Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. Например, `date(2002, 12, 4).weekday() == 2`, среда. См. также [`isoweekday()`](https://python-all.ru/2.7/library/datetime.html#datetime.date.isoweekday).301302#### `date.isoweekday()`303304Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. Например, `date(2002, 12, 4).isoweekday() == 3`, среда. См. также [`weekday()`](https://python-all.ru/2.7/library/datetime.html#datetime.date.weekday), [`isocalendar()`](https://python-all.ru/2.7/library/datetime.html#datetime.date.isocalendar).305306#### `date.isocalendar()`307308Возвращает кортеж из трёх элементов: (год по ISO, номер недели по ISO, день недели по ISO).309310ISO-календарь – широко используемый вариант григорианского календаря. См. [https://www.staff.science.uu.nl/~gent0113/calendar/isocalendar.htm](https://python-all.ru/2.7/library/datetime.html) для подробного объяснения.311312ISO-год состоит из 52 или 53 полных недель, при этом неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя ISO-года – это первая (григорианская) календарная неделя года, в которую входит четверг. Она называется неделей номер 1, и ISO-год этого четверга совпадает с его григорианским годом.313314Например, 2004 год начинается в четверг, поэтому первая неделя ISO-года 2004 начинается в понедельник, 29 декабря 2003 года, и заканчивается в воскресенье, 4 января 2004 года, так что `date(2003, 12, 29).isocalendar() == (2004, 1, 1)` и `date(2004, 1, 4).isocalendar() == (2004, 1, 7)`.315316#### `date.isoformat()`317318Возвращает строку, представляющую дату в формате ISO 8601, ‘YYYY-MM-DD’. Например, `date(2002, 12, 4).isoformat() == '2002-12-04'`.319320#### `date.__str__()`321322Для даты *d*, `str(d)` эквивалентен `d.isoformat()`.323324#### `date.ctime()`325326Возвращает строку, представляющую дату, например `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/2.7/library/time.html#time.ctime), но которую [`date.ctime()`](https://python-all.ru/2.7/library/datetime.html#datetime.date.ctime) не вызывает) соответствует стандарту C.327328#### `date.strftime(format)`329330Возвращает строку, представляющую дату, управляемую явной строкой формата. Коды формата, относящиеся к часам, минутам или секундам, будут иметь нулевые значения. Полный список директив форматирования см. в разделе [Поведение strftime() и strptime()](https://python-all.ru/2.7/library/datetime.html#strftime-strptime-behavior).331332#### `date.__format__(format)`333334То же, что и [`date.strftime()`](https://python-all.ru/2.7/library/datetime.html#datetime.date.strftime). Это позволяет указать строку формата для объекта [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) при использовании [`str.format()`](https://python-all.ru/2.7/library/stdtypes.html#str.format). См. раздел [Поведение strftime() и strptime()](https://python-all.ru/2.7/library/datetime.html#strftime-strptime-behavior).335336Пример подсчёта дней до события:337338```python339>>> import time340>>> from datetime import date341>>> today = date.today()342>>> today343datetime.date(2007, 12, 5)344>>> today == date.fromtimestamp(time.time())345True346>>> my_birthday = date(today.year, 6, 24)347>>> if my_birthday < today:348...     my_birthday = my_birthday.replace(year=today.year + 1)349>>> my_birthday350datetime.date(2008, 6, 24)351>>> time_to_birthday = abs(my_birthday - today)352>>> time_to_birthday.days353202354```355356Пример работы с [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date):357358```pycon359>>> from datetime import date360>>> d = date.fromordinal(730920) # 730920-й день после 1.1.0001361>>> d362datetime.date(2002, 3, 11)363>>> t = d.timetuple()364>>> for i in t:     365...     print i3662002                # year3673                   # month36811                  # day3690370037103720                   # weekday (0 = Monday)37370                  # 70th day in the year374-1375>>> ic = d.isocalendar()376>>> for i in ic:    377...     print i3782002                # ISO year37911                  # ISO week number3801                   # ISO day number ( 1 = Monday )381>>> d.isoformat()382'2002-03-11'383>>> d.strftime("%d/%m/%y")384'11/03/02'385>>> d.strftime("%A %d. %B %Y")386'Monday 11. March 2002'387>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")388'The day is 11, the month is March.'389```390391## 8.1.4. [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) Объекты392393Объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) – это единый объект, содержащий всю информацию из объекта [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) и объекта [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time). Как и объект [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) предполагает текущий григорианский календарь, расширенный в обе стороны; как и объект time, [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) предполагает, что в каждом дне ровно 3600\*24 секунд.394395Конструктор:396397#### `class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])`398399Аргументы год, месяц и день обязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами (int) или длинными целыми числами (long) в следующих диапазонах:400401- `MINYEAR <= year <= MAXYEAR`402- `1 <= month <= 12`403- `1 <= day <= number of days in the given month and year`404- `0 <= hour < 24`405- `0 <= minute < 60`406- `0 <= second < 60`407- `0 <= microsecond < 1000000`408409Если указан аргумент вне этих диапазонов, возбуждается [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError).410411Другие конструкторы – все методы класса:412413#### `classmethod datetime.today()`414415Возвращает текущую локальную дату и время с [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) `None`. Это эквивалентно `datetime.fromtimestamp(time.time())`. См. также [`now()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.now), [`fromtimestamp()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.fromtimestamp).416417#### `classmethod datetime.now([tz])`418419Возвращает текущую локальную дату и время. Если необязательный аргумент *tz* равен `None` или не указан, это подобно [`today()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.today), но, если возможно, предоставляет большую точность, чем можно получить через временную метку [`time.time()`](https://python-all.ru/2.7/library/time.html#time.time) (например, это может быть возможно на платформах, предоставляющих функцию C `gettimeofday()`).420421Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), и текущие дата и время преобразуются в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcnow().replace(tzinfo=tz))`. См. также [`today()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.today), [`utcnow()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.utcnow).422423#### `classmethod datetime.utcnow()`424425Возвращает текущую дату и время UTC, с [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) `None`. Это похоже на [`now()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.now), но возвращает текущую дату и время UTC как наивный объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). См. также [`now()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.now).426427#### `classmethod datetime.fromtimestamp(timestamp[, tz])`428429Возвращает локальные дату и время, соответствующие метке времени POSIX, такой как возвращается [`time.time()`](https://python-all.ru/2.7/library/time.html#time.time). Если необязательный аргумент *tz* равен `None` или не указан, метка времени преобразуется в локальные дату и время платформы, и возвращаемый объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) является наивным.430431Если *tz* не равен `None`, он должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), и временная метка преобразуется в часовой пояс *tz*. В этом случае результат эквивалентен `tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))`.432433[`fromtimestamp()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.fromtimestamp) может вызвать [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), если метка времени выходит за диапазон значений, поддерживаемых функциями `localtime()` или `gmtime()` языка C платформы. Обычно это ограничивается годами с 1970 по 2038. Обратите внимание, что в системах, не являющихся POSIX, которые включают високосные секунды в своё понятие метки времени, високосные секунды игнорируются [`fromtimestamp()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.fromtimestamp), и тогда возможно иметь две метки времени, отличающиеся на секунду, которые дают одинаковые объекты [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). См. также [`utcfromtimestamp()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.utcfromtimestamp).434435#### `classmethod datetime.utcfromtimestamp(timestamp)`436437Возвращает UTC [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), соответствующую метке времени POSIX, с [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) `None`. Может вызвать [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), если метка времени выходит за диапазон значений, поддерживаемых функцией `gmtime()` языка C платформы. Обычно это ограничивается годами с 1970 по 2038. См. также [`fromtimestamp()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.fromtimestamp).438439#### `classmethod datetime.fromordinal(ordinal)`440441Возвращает [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), соответствующий пролептическому григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1. [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) вызывается, если только `1 <= ordinal <= datetime.max.toordinal()`. Час, минута, секунда и микросекунда результата равны 0, а [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) `None`.442443#### `classmethod datetime.combine(date, time)`444445Возвращает новый объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), компоненты даты которого равны соответствующим компонентам заданного объекта [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date), а компоненты времени и атрибуты [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) равны соответствующим компонентам заданного объекта [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time). Для любого объекта [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) *d* выполняется `d == datetime.combine(d.date(), d.timetz())`. Если date является объектом [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), его компоненты времени и атрибуты [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) игнорируются.446447#### `classmethod datetime.strptime(date_string, format)`448449Возвращает [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), соответствующий *date\_string*, разобранному в соответствии с *format*. Это эквивалентно `datetime(*(time.strptime(date_string, format)[0:6]))`. [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) возникает, если date\_string и format не могут быть разобраны [`time.strptime()`](https://python-all.ru/2.7/library/time.html#time.strptime) или если возвращается значение, не являющееся временным кортежем. Полный список директив форматирования см. в разделе [Поведение strftime() и strptime()](https://python-all.ru/2.7/library/datetime.html#strftime-strptime-behavior).450451Новое в версии 2.5.452453Атрибуты класса:454455#### `datetime.min`456457Самое раннее представимое [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), `datetime(MINYEAR, 1, 1, tzinfo=None)`.458459#### `datetime.max`460461Самое позднее представимое [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), `datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)`.462463#### `datetime.resolution`464465Наименьшая возможная разница между неравными [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) объектами, `timedelta(microseconds=1)`.466467Атрибуты экземпляра (только для чтения):468469#### `datetime.year`470471От [`MINYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MINYEAR) до [`MAXYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MAXYEAR) включительно.472473#### `datetime.month`474475От 1 до 12 включительно.476477#### `datetime.day`478479От 1 до количества дней в указанном месяце указанного года.480481#### `datetime.hour`482483В `range(24)`.484485#### `datetime.minute`486487В `range(60)`.488489#### `datetime.second`490491В `range(60)`.492493#### `datetime.microsecond`494495В `range(1000000)`.496497#### `datetime.tzinfo`498499Объект, переданный в качестве аргумента *tzinfo* конструктору [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), или `None`, если ничего не было передано.500501Поддерживаемые операции:502503| Операция | Результат |504| --- | --- |505| `datetime2 = datetime1 + timedelta` | (1) |506| `datetime2 = datetime1 - timedelta` | (2) |507| `timedelta = datetime1 - datetime2` | (3) |508| `datetime1 < datetime2` | Сравнивает [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) с [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). (4) |5095101. datetime2 – это продолжительность timedelta, вычтенная из datetime1, сдвиг во времени вперед, если `timedelta.days` \> 0, или назад, если `timedelta.days` \< 0. Результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo), что и исходный datetime, и datetime2 - datetime1 == timedelta. [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError) вызывается, если datetime2.year будет меньше [`MINYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MINYEAR) или больше [`MAXYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MAXYEAR). Обратите внимание, что корректировка часового пояса не производится, даже если входные данные являются осведомленным объектом.5112. Вычисляет datetime2 так, что datetime2 + timedelta == datetime1. Как и при сложении, результат имеет тот же атрибут [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo), что и исходный datetime, и никаких корректировок часового пояса не производится, даже если исходный объект является aware. Это не совсем эквивалентно datetime1 + (-timedelta), поскольку -timedelta сам по себе может привести к переполнению в тех случаях, когда datetime1 - timedelta его не вызывает.5123. Вычитание [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) из [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) определено только в том случае, если оба операнда наивны или оба осведомлены. Если один осведомлен, а другой наивен, вызывается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).513514   Если оба наивны, или оба осведомлены и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo), атрибуты [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) игнорируются, и результатом является объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) *t* такой, что `datetime2 + t == datetime1`. В этом случае корректировка часового пояса не производится.515516   Если оба осведомлены и имеют разные атрибуты [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo), `a-b` ведёт себя так, как если бы *a* и *b* были сначала преобразованы в наивные даты и время в UTC. Результат – `(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`, за исключением того, что реализация никогда не вызывает переполнения.5174. *datetime1* считается меньше *datetime2*, когда *datetime1* предшествует *datetime2* по времени.518519   Если один операнд является наивным, а другой осведомлённым, вызывается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Если оба операнда осведомлённые и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) игнорируется, и базовые даты и время сравниваются. Если оба операнда осведомлённые и имеют разные атрибуты [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo), операнды сначала корректируются вычитанием их смещений UTC (полученных из `self.utcoffset()`).520521   > **Примечание**522   >523   > Чтобы предотвратить возврат к схеме сравнения по умолчанию, основанной на адресах объектов, сравнение datetime обычно вызывает [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError), если другой сравниваемый объект не является объектом [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). Однако `NotImplemented` возвращается вместо этого, если другой сравниваемый объект имеет атрибут `timetuple()`. Этот хук дает другим видам объектов даты возможность реализовать смешанное сравнение. Если нет, когда объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) сравнивается с объектом другого типа, [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError) вызывается, если только сравнение не является `==` или `!=`. Последние случаи возвращают [`False`](https://python-all.ru/2.7/library/constants.html#False) или [`True`](https://python-all.ru/2.7/library/constants.html#True) соответственно.524525Объекты [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) можно использовать в качестве ключей словаря. В логическом контексте все объекты [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) считаются истинными.526527Методы экземпляра:528529#### `datetime.date()`530531Возвращает объект [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) с тем же годом, месяцем и днём.532533#### `datetime.time()`534535Возвращает объект [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) с теми же значениями hour, minute, second и microsecond. [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) равен `None`. См. также метод [`timetz()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.timetz).536537#### `datetime.timetz()`538539Возвращает объект [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) с теми же атрибутами hour, minute, second, microsecond и tzinfo. См. также метод [`time()`](https://python-all.ru/2.7/library/time.html#module-time).540541#### `datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])`542543Возвращает datetime с теми же атрибутами, за исключением тех атрибутов, которым заданы новые значения указанными именованными аргументами. Обратите внимание, что `tzinfo=None` можно указать, чтобы создать наивный datetime из осведомленного datetime без преобразования данных даты и времени.544545#### `datetime.astimezone(tz)`546547Возвращает объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) с новым атрибутом [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) *tz*, корректируя данные даты и времени так, чтобы результат соответствовал тому же времени UTC, что и *self*, но в местном времени *tz*.548549*tz* должен быть экземпляром подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), а его методы [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.utcoffset) и [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.dst) не должны возвращать `None`. *self* должен быть осведомлённым (`self.tzinfo` не должен быть `None`, а `self.utcoffset()` не должен возвращать `None`).550551Если `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/2.7/library/datetime.html#datetime.tzinfo) объясняет случаи на границах перехода на летнее время, когда это невозможно достичь (проблема возникает только если *tz* моделирует как стандартное, так и летнее время).552553Если требуется просто прикрепить объект часового пояса *tz* к datetime *dt* без корректировки данных даты и времени, используйте `dt.replace(tzinfo=tz)`. Если требуется просто удалить объект часового пояса из осведомленного datetime *dt* без преобразования данных даты и времени, используйте `dt.replace(tzinfo=None)`.554555Обратите внимание, что метод по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc) можно переопределить в подклассе [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), чтобы повлиять на результат, возвращаемый [`astimezone()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.astimezone). Если не учитывать ошибки, [`astimezone()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.astimezone) работает следующим образом:556557```python558def astimezone(self, tz):559    if self.tzinfo is tz:560        return self561    # Преобразует self в UTC и присоединяет новый объект временной зоны.562    utc = (self - self.utcoffset()).replace(tzinfo=tz)563    # Преобразует из UTC в местное время tz.564    return tz.fromutc(utc)565```566567#### `datetime.utcoffset()`568569Если [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(self)` и вызывает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), представляющий целое количество минут с величиной менее одного дня.570571#### `datetime.dst()`572573Если [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.dst(self)` и вызывает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), представляющий целое число минут с величиной менее одного дня.574575#### `datetime.tzname()`576577Если [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) равно `None`, возвращается `None`, иначе возвращается `self.tzinfo.tzname(self)`, возбуждается исключение, если последний не возвращает `None` или строковый объект,578579#### `datetime.timetuple()`580581Возвращает [`time.struct_time`](https://python-all.ru/2.7/library/time.html#time.struct_time), такой как возвращаемый [`time.localtime()`](https://python-all.ru/2.7/library/time.html#time.localtime). `d.timetuple()` эквивалентен `time.struct_time((d.year, d.month, d.day, d.hour, d.minute, d.second, d.weekday(), yday, dst))`, где `yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1` – номер дня в текущем году, начиная с `1` для 1 января. Флаг `tm_isdst` результата устанавливается в соответствии с методом [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.dst): [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo) `None` или [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.dst) возвращает `None`, `tm_isdst` устанавливается в `-1`; иначе если [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.dst) возвращает ненулевое значение, `tm_isdst` устанавливается в `1`; иначе `tm_isdst` устанавливается в `0`.582583#### `datetime.utctimetuple()`584585Если экземпляр [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) *d* наивен, это то же самое, что `d.timetuple()`, за исключением того, что `tm_isdst` принудительно устанавливается в 0 независимо от того, что возвращает `d.dst()`. Переход на летнее время никогда не действует для времени UTC.586587Если *d* осведомлён, *d* нормализуется к времени UTC путём вычитания `d.utcoffset()`, и возвращается [`time.struct_time`](https://python-all.ru/2.7/library/time.html#time.struct_time) для нормализованного времени. `tm_isdst` принудительно устанавливается в 0. Обратите внимание, что член `tm_year` результата может быть [`MINYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MINYEAR)-1 или [`MAXYEAR`](https://python-all.ru/2.7/library/datetime.html#datetime.MAXYEAR)+1, если *d*.year был `MINYEAR` или `MAXYEAR`, и корректировка UTC переходит через границу года.588589#### `datetime.toordinal()`590591Возвращает пролептический григорианский порядковый номер даты. То же, что `self.date().toordinal()`.592593#### `datetime.weekday()`594595Возвращает день недели в виде целого числа, где понедельник – 0, а воскресенье – 6. То же, что `self.date().weekday()`. См. также [`isoweekday()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.isoweekday).596597#### `datetime.isoweekday()`598599Возвращает день недели в виде целого числа, где понедельник – 1, а воскресенье – 7. То же, что `self.date().isoweekday()`. См. также [`weekday()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.weekday), [`isocalendar()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.isocalendar).600601#### `datetime.isocalendar()`602603Возвращает кортеж из 3 элементов: (ISO год, ISO номер недели, ISO день недели). То же, что `self.date().isocalendar()`.604605#### `datetime.isoformat([sep])`606607Возвращает строку, представляющую дату и время в формате ISO 8601: YYYY-MM-DDTHH:MM:SS.mmmmmm или, если [`microsecond`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.microsecond) равно 0, YYYY-MM-DDTHH:MM:SS608609Если [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.utcoffset) не возвращает `None`, добавляется строка из 6 символов, дающая смещение UTC в (знаковых) часах и минутах: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM или, если [`microsecond`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.microsecond) равно 0, YYYY-MM-DDTHH:MM:SS+HH:MM610611Необязательный аргумент *sep* (по умолчанию `'T'`) – это односимвольный разделитель, помещаемый между частями даты и времени результата. Например,612613```python614>>> from datetime import tzinfo, timedelta, datetime615>>> class TZ(tzinfo):616...     def utcoffset(self, dt): return timedelta(minutes=-399)617...618>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')619'2002-12-25 00:00:00-06:39'620```621622#### `datetime.__str__()`623624Для экземпляра [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) *d*, `str(d)` эквивалентно `d.isoformat(' ')`.625626#### `datetime.ctime()`627628Возвращает строку, представляющую дату и время, например `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/2.7/library/time.html#time.ctime), но не вызывает [`datetime.ctime()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.ctime)) соответствует стандарту C.629630#### `datetime.strftime(format)`631632Возвращает строку, представляющую дату и время, управляемую явной строкой формата. Полный список директив форматирования см. в разделе [Поведение strftime() и strptime()](https://python-all.ru/2.7/library/datetime.html#strftime-strptime-behavior).633634#### `datetime.__format__(format)`635636То же, что и [`datetime.strftime()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.strftime). Это позволяет указать строку формата для объекта [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) при использовании [`str.format()`](https://python-all.ru/2.7/library/stdtypes.html#str.format). См. раздел [Поведение strftime() и strptime()](https://python-all.ru/2.7/library/datetime.html#strftime-strptime-behavior).637638Примеры работы с объектами datetime:639640```pycon641>>> from datetime import datetime, date, time642>>> # Использование datetime.combine()643>>> d = date(2005, 7, 14)644>>> t = time(12, 30)645>>> datetime.combine(d, t)646datetime.datetime(2005, 7, 14, 12, 30)647>>> # Использование datetime.now() или datetime.utcnow()648>>> datetime.now()   649datetime.datetime(2007, 12, 6, 16, 29, 43, 79043)   # GMT +1650>>> datetime.utcnow()   651datetime.datetime(2007, 12, 6, 15, 29, 43, 79060)652>>> # Использование datetime.strptime()653>>> dt = datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")654>>> dt655datetime.datetime(2006, 11, 21, 16, 30)656>>> # Использование datetime.timetuple() для получения кортежа всех атрибутов657>>> tt = dt.timetuple()658>>> for it in tt:   659...     print it660...6612006    # year66211      # month66321      # day66416      # hour66530      # minute6660       # second6671       # weekday (0 = Monday)668325     # number of days since 1st January669-1      # dst - method tzinfo.dst() returned None670>>> # Дата в формате ISO671>>> ic = dt.isocalendar()672>>> for it in ic:   673...     print it674...6752006    # ISO year67647      # ISO week6772       # ISO weekday678>>> # Форматирование datetime679>>> dt.strftime("%A, %d. %B %Y %I:%M%p")680'Tuesday, 21. November 2006 04:30PM'681>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")682'The day is 21, the month is November, the time is 04:30PM.'683```684685Использование datetime с tzinfo:686687```python688>>> from datetime import timedelta, datetime, tzinfo689>>> class GMT1(tzinfo):690...     def utcoffset(self, dt):691...         return timedelta(hours=1) + self.dst(dt)692...     def dst(self, dt):693...         # Летнее время начинается в последнее воскресенье марта694...         d = datetime(dt.year, 4, 1)   # Заканчивается в последнее воскресенье октября695...         self.dston = d - timedelta(days=d.weekday() + 1)696...         d = datetime(dt.year, 11, 1)697...         self.dstoff = d - timedelta(days=d.weekday() + 1)698...         if self.dston <=  dt.replace(tzinfo=None) < self.dstoff:699...             return timedelta(hours=1)700...         else:701...             return timedelta(0)702...     def tzname(self,dt):703...          return "GMT +1"704...705>>> class GMT2(tzinfo):706...     def utcoffset(self, dt):707...         return timedelta(hours=2) + self.dst(dt)708...     def dst(self, dt):709...         d = datetime(dt.year, 4, 1)710...         self.dston = d - timedelta(days=d.weekday() + 1)711...         d = datetime(dt.year, 11, 1)712...         self.dstoff = d - timedelta(days=d.weekday() + 1)713...         if self.dston <=  dt.replace(tzinfo=None) < self.dstoff:714...             return timedelta(hours=1)715...         else:716...             return timedelta(0)717...     def tzname(self,dt):718...         return "GMT +2"719...720>>> gmt1 = GMT1()721>>> # Летнее время722>>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1)723>>> dt1.dst()724datetime.timedelta(0)725>>> dt1.utcoffset()726datetime.timedelta(0, 3600)727>>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1)728>>> dt2.dst()729datetime.timedelta(0, 3600)730>>> dt2.utcoffset()731datetime.timedelta(0, 7200)732>>> # Преобразовать datetime в другой часовой пояс733>>> dt3 = dt2.astimezone(GMT2())734>>> dt3     735datetime.datetime(2006, 6, 14, 14, 0, tzinfo=<GMT2 object at 0x...>)736>>> dt2     737datetime.datetime(2006, 6, 14, 13, 0, tzinfo=<GMT1 object at 0x...>)738>>> dt2.utctimetuple() == dt3.utctimetuple()739True740```741742## 8.1.5. [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) Объекты743744Объект time представляет (локальное) время суток, независимо от конкретного дня, и может корректироваться с помощью объекта [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo).745746#### `class datetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]])`747748Все аргументы необязательны. *tzinfo* может быть `None` или экземпляром подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo). Остальные аргументы могут быть целыми числами (int) или длинными целыми числами (long) в следующих диапазонах:749750- `0 <= hour < 24`751- `0 <= minute < 60`752- `0 <= second < 60`753- `0 <= microsecond < 1000000`.754755Если указан аргумент вне этих диапазонов, вызывается [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError). Все по умолчанию равны `0`, кроме *tzinfo*, который по умолчанию равен [`None`](https://python-all.ru/2.7/library/constants.html#None).756757Атрибуты класса:758759#### `time.min`760761Самое раннее представимое [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time), `time(0, 0, 0, 0)`.762763#### `time.max`764765Самое позднее представимое [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time), `time(23, 59, 59, 999999)`.766767#### `time.resolution`768769Наименьшая возможная разница между неравными объектами [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time), `timedelta(microseconds=1)`, хотя следует отметить, что арифметические операции над объектами [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) не поддерживаются.770771Атрибуты экземпляра (только для чтения):772773#### `time.hour`774775В `range(24)`.776777#### `time.minute`778779В `range(60)`.780781#### `time.second`782783В `range(60)`.784785#### `time.microsecond`786787В `range(1000000)`.788789#### `time.tzinfo`790791Объект, переданный как аргумент tzinfo конструктору [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time), или `None`, если ничего не было передано.792793Поддерживаемые операции:794795- сравнение [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) с [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time), где *a* считается меньше *b*, если *a* предшествует *b* во времени. Если один из операндов наивный, а другой осведомлённый, возбуждается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Если оба операнда осведомлённые и имеют одинаковый атрибут [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.time.tzinfo), общий атрибут [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.time.tzinfo) игнорируется и сравниваются базовые моменты времени. Если оба операнда осведомлённые и имеют разные атрибуты [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.time.tzinfo), операнды сначала корректируются вычитанием их смещений UTC (полученных из `self.utcoffset()`). Чтобы предотвратить откат сравнений смешанных типов к сравнению по умолчанию по адресу объекта, при сравнении объекта [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) с объектом другого типа возбуждается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError), если только сравнение не является `==` или `!=`. В последних случаях возвращаются соответственно [`False`](https://python-all.ru/2.7/library/constants.html#False) или [`True`](https://python-all.ru/2.7/library/constants.html#True).796- хэш, использование в качестве ключа словаря797- эффективная сериализация (pickling)798- в логическом контексте объект [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) считается истинным тогда и только тогда, когда после преобразования его в минуты и вычитания `utcoffset()` (или `0`, если оно `None`), результат не равен нулю.799800Методы экземпляра:801802#### `time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]])`803804Возвращает [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) с теми же значениями, за исключением атрибутов, которым заданы новые значения указанными именованными аргументами. Обратите внимание, что `tzinfo=None` можно указать, чтобы создать наивный [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) из осознанного [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) без преобразования данных о времени.805806#### `time.isoformat()`807808Возвращает строку, представляющую время в формате ISO 8601: HH:MM:SS.mmmmmm или, если self.microsecond равен 0, HH:MM:SS. Если [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.time.utcoffset) не возвращает `None`, добавляется строка из 6 символов, содержащая смещение UTC в (знаковых) часах и минутах: HH:MM:SS.mmmmmm+HH:MM или, если self.microsecond равен 0, HH:MM:SS+HH:MM809810#### `time.__str__()`811812Для времени *t*, `str(t)` эквивалентно `t.isoformat()`.813814#### `time.strftime(format)`815816Возвращает строку, представляющую время, управляемую явной строкой форматирования. Полный список директив форматирования приведён в разделе [Поведение strftime() и strptime()](https://python-all.ru/2.7/library/datetime.html#strftime-strptime-behavior).817818#### `time.__format__(format)`819820То же, что и [`time.strftime()`](https://python-all.ru/2.7/library/datetime.html#datetime.time.strftime). Это позволяет указать строку форматирования для объекта [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) при использовании [`str.format()`](https://python-all.ru/2.7/library/stdtypes.html#str.format). См. раздел [Поведение strftime() и strptime()](https://python-all.ru/2.7/library/datetime.html#strftime-strptime-behavior).821822#### `time.utcoffset()`823824Если [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.utcoffset(None)` и вызывает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), представляющий целое количество минут с величиной менее одного дня.825826#### `time.dst()`827828Если [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.dst(None)` и вызывает исключение, если последнее не возвращает `None` или объект [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), представляющий целое число минут с величиной менее одного дня.829830#### `time.tzname()`831832Если [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.time.tzinfo) равно `None`, возвращает `None`, иначе возвращает `self.tzinfo.tzname(None)`, или возбуждает исключение, если последнее не возвращает `None` или строковый объект.833834Пример:835836```python837>>> from datetime import time, tzinfo, timedelta838>>> class GMT1(tzinfo):839...     def utcoffset(self, dt):840...         return timedelta(hours=1)841...     def dst(self, dt):842...         return timedelta(0)843...     def tzname(self,dt):844...         return "Europe/Prague"845...846>>> t = time(12, 10, 30, tzinfo=GMT1())847>>> t                               848datetime.time(12, 10, 30, tzinfo=<GMT1 object at 0x...>)849>>> gmt = GMT1()850>>> t.isoformat()851'12:10:30+01:00'852>>> t.dst()853datetime.timedelta(0)854>>> t.tzname()855'Europe/Prague'856>>> t.strftime("%H:%M:%S %Z")857'12:10:30 Europe/Prague'858>>> 'The {} is {:%H:%M}.'.format("time", t)859'The time is 12:10.'860```861862## 8.1.6. [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) Объекты863864#### `class datetime.tzinfo`865866Это абстрактный базовый класс, то есть этот класс не следует инстанцировать напрямую. Необходимо создать конкретный подкласс и (как минимум) реализовать стандартные методы [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), необходимые для использования методов [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime). Модуль [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) не предоставляет никаких конкретных подклассов [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo).867868Экземпляр (конкретного подкласса) [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) можно передать конструкторам объектов [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time). Последние рассматривают свои атрибуты как местное время, а объект [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) поддерживает методы, показывающие смещение местного времени от UTC, название часового пояса и смещение DST – все относительно переданного им объекта даты или времени.869870Особое требование для сериализации (pickling): подкласс [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) должен иметь метод [`__init__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__init__), который можно вызывать без аргументов; иначе объект можно сериализовать, но, возможно, нельзя будет десериализовать. Это техническое требование, которое в будущем может быть смягчено.871872Конкретному подклассу [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) может потребоваться реализовать следующие методы. Какие именно методы нужны, зависит от того, как используются осознанные объекты [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime). Если есть сомнения, просто реализуйте их все.873874#### `tzinfo.utcoffset(self, dt)`875876Возвращает смещение местного времени относительно UTC в минутах к востоку от UTC. Если местное время находится к западу от UTC, значение должно быть отрицательным. Обратите внимание, что это суммарное смещение от UTC; например, если объект [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) представляет как часовой пояс, так и поправку на летнее время, [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.utcoffset) должна возвращать их сумму. Если смещение UTC неизвестно, верните `None`. В противном случае возвращаемое значение должно быть объектом [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta), задающим целое число минут в диапазоне от -1439 до 1439 включительно (1440 = 24\*60; величина смещения должна быть менее одного дня). Большинство реализаций [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.utcoffset), вероятно, будут выглядеть как один из этих двух:877878```python879return CONSTANT                 # класс с фиксированным смещением880return CONSTANT + self.dst(dt)  # класс, учитывающий летнее время881```882883Если [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.utcoffset) не возвращает `None`, то [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.dst) также не должен возвращать `None`.884885Реализация по умолчанию [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.utcoffset) возбуждает [`NotImplementedError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.NotImplementedError).886887#### `tzinfo.dst(self, dt)`888889Возвращает поправку на летнее время (DST) в минутах к востоку от UTC или `None`, если информация о DST неизвестна. Возвращает `timedelta(0)`, если летнее время не действует. Если летнее время действует, возвращает смещение в виде объекта [`timedelta`](https://python-all.ru/2.7/library/datetime.html#datetime.timedelta) (подробнее см. [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.utcoffset)). Обратите внимание, что смещение DST, если применимо, уже добавлено к смещению UTC, возвращаемому [`utcoffset()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.utcoffset), поэтому нет необходимости обращаться к [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.dst), если вы не хотите получить информацию о DST отдельно. Например, [`datetime.timetuple()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.timetuple) вызывает метод [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.dst) своего атрибута [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.tzinfo), чтобы определить, как должен быть установлен флаг `tm_isdst`, а [`tzinfo.fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc) вызывает [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.dst) для учёта изменений DST при пересечении часовых поясов.890891Экземпляр *tz* подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), который моделирует как стандартное, так и летнее время, должен быть согласован в следующем смысле:892893`tz.utcoffset(dt) - tz.dst(dt)`894895должен возвращать один и тот же результат для каждого [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) *dt* с `dt.tzinfo == tz`. Для разумных подклассов [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) это выражение даёт «стандартное смещение» часового пояса, которое не должно зависеть от даты или времени, а только от географического положения. Реализация [`datetime.astimezone()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.astimezone) полагается на это, но не может обнаружить нарушения; это ответственность программиста – гарантировать это. Если подкласс [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) не может этого гарантировать, он может переопределить реализацию по умолчанию [`tzinfo.fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc), чтобы она корректно работала с `astimezone()`.896897Большинство реализаций [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.dst), вероятно, будут выглядеть как один из этих двух вариантов:898899```python900def dst(self, dt):901    # класс с фиксированным смещением: не учитывает летнее время902    return timedelta(0)903```904905или906907```python908def dst(self, dt):909    # Код для установки dston и dstoff в значения летнего времени часового пояса910    # переходные моменты времени на основе входного dt.year и выраженные911    # в стандартном местном времени.  Затем912913    if dston <= dt.replace(tzinfo=None) < dstoff:914        return timedelta(hours=1)915    else:916        return timedelta(0)917```918919Реализация по умолчанию [`dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.dst) вызывает исключение [`NotImplementedError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.NotImplementedError).920921#### `tzinfo.tzname(self, dt)`922923Возвращает название часового пояса, соответствующее объекту [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) *dt*, в виде строки. Модуль [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) ничего не определяет относительно строковых названий, и нет требования, чтобы они значили что-то конкретное. Например, «GMT», «UTC», «-500», «-5:00», «EDT», «US/Eastern», «America/New York» – все это допустимые ответы. Верните `None`, если строковое название неизвестно. Обратите внимание, что это метод, а не фиксированная строка, в первую очередь потому, что некоторые подклассы [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) могут захотеть возвращать разные названия в зависимости от конкретного значения *dt*, особенно если класс [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) учитывает летнее время.924925Реализация по умолчанию [`tzname()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.tzname) вызывает исключение [`NotImplementedError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.NotImplementedError).926927Эти методы вызываются объектом [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) или [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) в ответ на их одноимённые методы. Объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) передаёт себя в качестве аргумента, а объект [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) передаёт `None`. Поэтому методы подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) должны быть готовы принять аргумент *dt* типа `None` или класса [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime).928929Когда передаётся `None`, разработчик класса решает, какой ответ будет наилучшим. Например, возврат `None` уместен, если класс хочет указать, что объекты времени не участвуют в протоколах [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo). Возможно, более полезным будет для `utcoffset(None)` вернуть стандартное UTC-смещение, поскольку другого способа узнать стандартное смещение нет.930931Когда объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) передаётся в ответ на метод [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime), `dt.tzinfo` – это тот же объект, что и *self*. Методы [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) могут на это полагаться, если только пользовательский код не вызывает методы [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) напрямую. Предполагается, что методы [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) интерпретируют *dt* как местное время и не должны беспокоиться об объектах в других часовых поясах.932933Существует ещё один метод [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), который подкласс может переопределить:934935#### `tzinfo.fromutc(self, dt)`936937Это вызывается из реализации по умолчанию [`datetime.astimezone()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.astimezone). При вызове оттуда `dt.tzinfo` – это *self*, а данные даты и времени *dt* следует рассматривать как выражающие время UTC. Цель [`fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc) – скорректировать данные даты и времени, вернув эквивалентный datetime в местном времени *self*.938939Большинство подклассов [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) должны без проблем наследовать реализацию по умолчанию [`fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc). Она достаточно мощная, чтобы обрабатывать часовые пояса с фиксированным смещением, а также пояса, учитывающие как стандартное, так и летнее время, причём последнее – даже если время перехода на летнее время различается в разные годы. Пример часового пояса, который реализация по умолчанию [`fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc) может не всегда корректно обрабатывать, – это пояс, где стандартное смещение (от UTC) зависит от конкретной даты и времени, что может происходить по политическим причинам. Реализации по умолчанию `astimezone()` и [`fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc) могут не дать желаемого результата, если результат приходится на часы, охватывающие момент изменения стандартного смещения.940941Опуская код для обработки ошибок, реализация по умолчанию [`fromutc()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.fromutc) работает следующим образом:942943```python944def fromutc(self, dt):945    # вызывает ошибку ValueError, если dt.tzinfo не равен self946    dtoff = dt.utcoffset()947    dtdst = dt.dst()948    # вызывает ValueError, если dtoff или dtdst равны None949    delta = dtoff - dtdst  # это стандартное смещение self950    if delta:951        dt += delta   # преобразовать в стандартное местное время952        dtdst = dt.dst()953        # вызывает ValueError, если dtdst равен None954    if dtdst:955        return dt + dtdst956    else:957        return dt958```959960Пример классов [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo):961962```python963from datetime import tzinfo, timedelta, datetime964965ZERO = timedelta(0)966HOUR = timedelta(hours=1)967968# Класс UTC.969970class UTC(tzinfo):971    """UTC"""972973    def utcoffset(self, dt):974        return ZERO975976    def tzname(self, dt):977        return "UTC"978979    def dst(self, dt):980        return ZERO981982utc = UTC()983984# Класс, создающий объекты tzinfo для часовых поясов с фиксированным смещением.985# Обратите внимание, что FixedOffset(0, "UTC") – это другой способ построения986# Объект tzinfo UTC.987988class FixedOffset(tzinfo):989    """Фиксированное смещение в минутах к востоку от UTC."""990991    def __init__(self, offset, name):992        self.__offset = timedelta(minutes = offset)993        self.__name = name994995    def utcoffset(self, dt):996        return self.__offset997998    def tzname(self, dt):999        return self.__name10001001    def dst(self, dt):1002        return ZERO10031004# Класс, отражающий представление платформы о местном времени.10051006import time as _time10071008STDOFFSET = timedelta(seconds = -_time.timezone)1009if _time.daylight:1010    DSTOFFSET = timedelta(seconds = -_time.altzone)1011else:1012    DSTOFFSET = STDOFFSET10131014DSTDIFF = DSTOFFSET - STDOFFSET10151016class LocalTimezone(tzinfo):10171018    def utcoffset(self, dt):1019        if self._isdst(dt):1020            return DSTOFFSET1021        else:1022            return STDOFFSET10231024    def dst(self, dt):1025        if self._isdst(dt):1026            return DSTDIFF1027        else:1028            return ZERO10291030    def tzname(self, dt):1031        return _time.tzname[self._isdst(dt)]10321033    def _isdst(self, dt):1034        tt = (dt.year, dt.month, dt.day,1035              dt.hour, dt.minute, dt.second,1036              dt.weekday(), 0, 0)1037        stamp = _time.mktime(tt)1038        tt = _time.localtime(stamp)1039        return tt.tm_isdst > 010401041Local = LocalTimezone()10421043# Полная реализация текущих правил летнего времени для основных часовых поясов США.10441045def first_sunday_on_or_after(dt):1046    days_to_go = 6 - dt.weekday()1047    if days_to_go:1048        dt += timedelta(days_to_go)1049    return dt10501051# Правила летнего времени в США1052#1053# Это упрощённый набор правил для США (т.е. неверный для некоторых случаев)1054# времени начала и окончания летнего времени. Полный и актуальный набор правил летнего времени1055# и определений часовых поясов смотрите в базе данных Olson (или попробуйте pytz):1056# http://www.twinsun.com/tz/tz-link.htm1057# http://sourceforge.net/projects/pytz/ (возможно, неактуально)1058#1059# В США с 2007 года летнее время начинается в 2 часа ночи (стандартное время) во второе1060# воскресенье марта, то есть первое воскресенье 8 марта или после него.1061DSTSTART_2007 = datetime(1, 3, 8, 2)1062# и заканчивается в 2 часа ночи (по летнему времени; 1 час ночи по стандартному времени) в первое воскресенье ноября.1063DSTEND_2007 = datetime(1, 11, 1, 1)1064# С 1987 по 2006 год летнее время начиналось в 2 часа ночи (стандартное время) в первое1065# воскресенье в апреле и заканчиваться в 2 часа ночи (по летнему времени; 1 час ночи по стандартному времени) в последнее1066# воскресенье октября, то есть первое воскресенье 25 октября или после него.1067DSTSTART_1987_2006 = datetime(1, 4, 1, 2)1068DSTEND_1987_2006 = datetime(1, 10, 25, 1)1069# С 1967 по 1986 год летнее время начиналось в 2 часа ночи (стандартное время) в последнее1070# воскресенье апреля (то, которое приходится на 24 апреля или позже) и заканчиваться в 2 часа ночи (по летнему времени;1071# 1 час ночи по стандартному времени) в последнее воскресенье октября, которое является первым воскресеньем1072# 25 октября или позднее.1073DSTSTART_1967_1986 = datetime(1, 4, 24, 2)1074DSTEND_1967_1986 = DSTEND_1987_200610751076class USTimeZone(tzinfo):10771078    def __init__(self, hours, reprname, stdname, dstname):1079        self.stdoffset = timedelta(hours=hours)1080        self.reprname = reprname1081        self.stdname = stdname1082        self.dstname = dstname10831084    def __repr__(self):1085        return self.reprname10861087    def tzname(self, dt):1088        if self.dst(dt):1089            return self.dstname1090        else:1091            return self.stdname10921093    def utcoffset(self, dt):1094        return self.stdoffset + self.dst(dt)10951096    def dst(self, dt):1097        if dt is None or dt.tzinfo is None:1098            # В одном или обоих случаях здесь может быть уместно исключение.1099            # Это зависит от того, как вы хотите их обрабатывать. Реализация по умолчанию1100            # fromutc() (вызываемая реализацией astimezone() по умолчанию)1101            # реализация) передаёт datetime с dt.tzinfo равным self.1102            return ZERO1103        assert dt.tzinfo is self11041105        # Найти время начала и окончания перехода на летнее время в США. Для лет до 1967 года вернуть1106        # ZERO – если переход на летнее время не применяется.1107        if 2006 < dt.year:1108            dststart, dstend = DSTSTART_2007, DSTEND_20071109        elif 1986 < dt.year < 2007:1110            dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_20061111        elif 1966 < dt.year < 1987:1112            dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_19861113        else:1114            return ZERO11151116        start = first_sunday_on_or_after(dststart.replace(year=dt.year))1117        end = first_sunday_on_or_after(dstend.replace(year=dt.year))11181119        # Нельзя сравнивать наивные и осведомлённые объекты, поэтому сначала удалите часовой пояс из1120        # сначала dt.1121        if start <= dt.replace(tzinfo=None) < end:1122            return HOUR1123        else:1124            return ZERO11251126Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")1127Central  = USTimeZone(-6, "Central",  "CST", "CDT")1128Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")1129Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")1130```11311132Обратите внимание, что дважды в год в подклассе [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), учитывающем как стандартное, так и летнее время, в точках перехода на летнее время возникают неизбежные тонкости. Для конкретики рассмотрим US Eastern (UTC -0500), где EDT начинается через минуту после 1:59 (EST) во второе воскресенье марта и заканчивается через минуту после 1:59 (EDT) в первое воскресенье ноября:11331134```python1135  UTC   3:MM  4:MM  5:MM  6:MM  7:MM  8:MM1136  EST  22:MM 23:MM  0:MM  1:MM  2:MM  3:MM1137  EDT  23:MM  0:MM  1:MM  2:MM  3:MM  4:MM11381139start  22:MM 23:MM  0:MM  1:MM  3:MM  4:MM11401141  end  23:MM  0:MM  1:MM  1:MM  2:MM  3:MM1142```11431144Когда начинается летнее время (строка «start»), местные часы перескакивают с 1:59 на 3:00. Местное время вида 2:MM в этот день не имеет смысла, поэтому `astimezone(Eastern)` не вернёт результат с `hour == 2` в день перехода на летнее время. Чтобы `astimezone()` мог это гарантировать, метод `rzinfo.dst()` должен считать моменты «потерянного часа» (2:MM для восточного времени) относящимися к летнему времени.11451146Когда летнее время заканчивается (строка «end»), возникает потенциально более серьёзная проблема: существует час, который нельзя однозначно записать в местном времени, – последний час летнего времени. Для восточного времени это моменты вида 5:MM UTC в день окончания летнего времени. Местные часы перескакивают с 1:59 (летнее время) обратно на 1:00 (стандартное время). Местное время вида 1:MM становится неоднозначным. `astimezone()` имитирует поведение местных часов, отображая два соседних часа UTC в один и тот же местный час. В примере с восточным временем моменты UTC вида 5:MM и 6:MM оба преобразуются в 1:MM при переводе в восточное время. Чтобы `astimezone()` мог это гарантировать, метод [`tzinfo.dst()`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo.dst) должен считать моменты «повторяющегося часа» относящимися к стандартному времени. Это легко устроить, как в примере, выражая моменты перехода на летнее время в стандартном местном времени часового пояса.11471148Приложения, которые не выдерживают таких неоднозначностей, должны избегать использования гибридных подклассов [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo); неоднозначности отсутствуют при использовании UTC или любого другого подкласса [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo) с фиксированным смещением (например, класс, представляющий только EST (фиксированное смещение -5 часов), или только EDT (фиксированное смещение -4 часа)).11491150> **См. также**1151>1152> **[pytz](https://python-all.ru/2.7/library/datetime.html)**1153>1154> В стандартной библиотеке нет экземпляров [`tzinfo`](https://python-all.ru/2.7/library/datetime.html#datetime.tzinfo), но существует сторонняя библиотека, которая предоставляет *базу данных часовых поясов IANA* (также известную как база данных Olson) для Python: *pytz*.1155>1156> *pytz* содержит актуальную информацию, и его использование рекомендуется.1157>1158> **[база данных часовых поясов IANA](https://python-all.ru/2.7/library/datetime.html)**1159>1160> База данных часовых поясов (часто называемая tz или zoneinfo) содержит код и данные, представляющие историю местного времени для многих характерных точек по всему миру. Она периодически обновляется, чтобы отражать изменения, вносимые политическими органами в границы часовых поясов, смещения UTC и правила перехода на летнее время.11611162## Поведение 8.1.7. `strftime()` и `strptime()`11631164Объекты [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date), [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) поддерживают метод `strftime(format)`, который создаёт строку, представляющую время, под управлением явной форматной строки. В общем, `d.strftime(fmt)` действует как `time.strftime(fmt, d.timetuple())` модуля [`time`](https://python-all.ru/2.7/library/time.html#module-time), хотя не все объекты поддерживают метод `timetuple()`.11651166И наоборот, метод класса [`datetime.strptime()`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime.strptime) создаёт объект [`datetime`](https://python-all.ru/2.7/library/datetime.html#datetime.datetime) из строки, представляющей дату и время, и соответствующей форматной строки. `datetime.strptime(date_string, format)` эквивалентен `datetime(*(time.strptime(date_string, format)[0:6]))`, за исключением случаев, когда формат включает субсекундные компоненты или информацию о смещении часового пояса, которые поддерживаются в `datetime.strptime`, но отбрасываются `time.strptime`.11671168Для объектов [`time`](https://python-all.ru/2.7/library/datetime.html#datetime.time) не следует использовать коды формата для года, месяца и дня, поскольку объекты time не имеют таких значений. Если они всё же используются, то `1900` подставляется для года, а `1` – для месяца и дня.11691170Для объектов [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) не следует использовать коды формата для часов, минут, секунд и микросекунд, поскольку объекты [`date`](https://python-all.ru/2.7/library/datetime.html#datetime.date) не имеют таких значений. Если они всё же используются, то `0` подставляется для них.11711172Полный набор поддерживаемых кодов формата различается на разных платформах, поскольку Python вызывает функцию `strftime()` из C-библиотеки платформы, и различия между платформами обычны. Чтобы просмотреть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации *strftime(3)*.11731174По той же причине обработка строк формата, содержащих кодовые точки Unicode, которые не могут быть представлены в кодировке текущей локали, также зависит от платформы. На некоторых платформах такие кодовые точки сохраняются в выходных данных без изменений, в то время как на других `strftime` может вызвать [`UnicodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeError) или вернуть пустую строку.11751176Ниже приведён список всех кодов формата, которые требуются стандартом C (версии 1989 года), и они работают на всех платформах со стандартной реализацией C. Обратите внимание, что версия 1999 года стандарта C добавила дополнительные коды формата.11771178Точный диапазон лет, для которых работает `strftime()`, также зависит от платформы. Независимо от платформы, годы до 1900 не могут быть использованы.11791180| Директива | Значение | Пример | Примечания |1181| --- | --- | --- | --- |1182| `%a` | День недели как сокращённое название в локали. | Вс, Пн, …, Сб (en\_US); So, Mo, …, Sa (de\_DE) | (1) |1183| `%A` | Название дня недели в полной форме, зависящее от локали. | Воскресенье, Понедельник, …, Суббота (en\_US); Sonntag, Montag, …, Samstag (de\_DE) | (1) |1184| `%w` | День недели в виде десятичного числа, где 0 – воскресенье, а 6 – суббота. | 0, 1, …, 6 |  |1185| `%d` | День месяца в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 31 |  |1186| `%b` | Название месяца в сокращённой форме, зависящей от локали. | Янв, Фев, …, Дек (en\_US); Jan, Feb, …, Dez (de\_DE) | (1) |1187| `%B` | Название месяца в полной форме, зависящей от локали. | Январь, Февраль, …, Декабрь (en\_US); Januar, Februar, …, Dezember (de\_DE) | (1) |1188| `%m` | Месяц в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 |  |1189| `%y` | Год без столетия в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 99 |  |1190| `%Y` | Год со столетием в виде десятичного числа. | 1970, 1988, 2001, 2013 |  |1191| `%H` | Часы (в 24-часовом формате) в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 23 |  |1192| `%I` | Часы (в 12-часовом формате) в виде десятичного числа, дополненного слева нулями. | 01, 02, …, 12 |  |1193| `%p` | Эквивалент AM или PM, зависящий от локали. | AM, PM (en\_US); am, pm (de\_DE) | (1), (2) |1194| `%M` | Минуты в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 |  |1195| `%S` | Секунды в виде десятичного числа, дополненного слева нулями. | 00, 01, …, 59 | (3) |1196| `%f` | Микросекунда в виде десятичного числа, дополненного слева нулями. | 000000, 000001, …, 999999 | (4) |1197| `%z` | Смещение UTC в формате +HHMM или -HHMM (пустая строка, если объект наивный). | (пусто), +0000, -0400, +1030 | (5) |1198| `%Z` | Название часового пояса (пустая строка, если объект наивный). | (пусто), UTC, EST, CST |  |1199| `%j` | День года в виде десятичного числа, дополненного слева нулями. | 001, 002, …, 366 |  |1200| `%U` | Номер недели в году (воскресенье – первый день недели) в виде десятичного числа, дополненного нулями слева. Все дни нового года, предшествующие первому воскресенью, считаются неделей 0. | 00, 01, …, 53 | (6) |1201| `%W` | Номер недели в году (понедельник – первый день недели) в виде десятичного числа. Все дни нового года, предшествующие первому понедельнику, считаются неделей 0. | 00, 01, …, 53 | (6) |1202| `%c` | Представление даты и времени, подходящее для локали. | Вт Авг 16 21:30:00 1988 (en\_US); Di 16 Aug 21:30:00 1988 (de\_DE) | (1) |1203| `%x` | Представление даты, соответствующее локали. | 08/16/88 (None); 08/16/1988 (en\_US); 16.08.1988 (de\_DE) | (1) |1204| `%X` | Представление времени, соответствующее локали. | 21:30:00 (en\_US); 21:30:00 (de\_DE) | (1) |1205| `%%` | Литеральный символ `'%'`. | % |  |12061207Примечания:120812091. Поскольку формат зависит от текущей локали, следует проявлять осторожность при выводах о возвращаемом значении. Порядок полей может различаться (например, “месяц/день/год” вместо “день/месяц/год”), а результат может содержать символы Unicode, закодированные с помощью кодировки локали по умолчанию (например, если текущая локаль – `ja_JP`, кодировкой по умолчанию может быть любая из `eucJP`, `SJIS` или `utf-8`; используйте [`locale.getlocale()`](https://python-all.ru/2.7/library/locale.html#locale.getlocale), чтобы определить кодировку текущей локали).12102. При использовании с методом `strptime()` директива `%p` влияет только на поле вывода часа, если директива `%I` используется для разбора часа.12113. В отличие от модуля [`time`](https://python-all.ru/2.7/library/time.html#module-time), модуль [`datetime`](https://python-all.ru/2.7/library/datetime.html#module-datetime) не поддерживает високосные секунды.12124. `%f` является расширением набора символов форматирования в стандарте C (но реализовано отдельно в объектах datetime и поэтому всегда доступно). При использовании с методом `strptime()` директива `%f` принимает от одной до шести цифр и дополняет нулями справа.12131214   Новое в версии 2.6.12155. Для наивного объекта коды формата `%z` и `%Z` заменяются пустыми строками.12161217   Для осведомлённого объекта:12181219   **`%z`**12201221   `utcoffset()` преобразуется в строку из 5 символов вида +HHMM или -HHMM, где HH – двухзначная строка, задающая количество часов смещения UTC, а MM – двухзначная строка, задающая количество минут смещения UTC. Например, если `utcoffset()` возвращает `timedelta(hours=-3, minutes=-30)`, то `%z` заменяется строкой `'-0330'`.12221223   **`%Z`**12241225   Если `tzname()` возвращает `None`, то `%Z` заменяется пустой строкой. В противном случае `%Z` заменяется возвращаемым значением, которое должно быть строкой.12266. При использовании с методом `strptime()`, `%U` и `%W` используются только в вычислениях, когда указаны день недели и год.12271228Сноски12291230**[1](https://python-all.ru/2.7/library/datetime.html#id1)**12311232Если, конечно, не учитывать эффекты теории относительности1233