calendar.md
1> **Источник:** https://python-all.ru/3.7/library/calendar.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`calendar`](https://python-all.ru/3.7/library/calendar.html#module-calendar) – Общие функции работы с календарём89**Исходный код:** [Lib/calendar.py](https://python-all.ru/src/3.7/Lib/calendar.py)1011---1213Этот модуль позволяет выводить календари, как программа Unix **cal**, и предоставляет дополнительные полезные функции, связанные с календарём. По умолчанию в этих календарях первый день недели – понедельник, а последний – воскресенье (европейская конвенция). Используйте [`setfirstweekday()`](https://python-all.ru/3.7/library/calendar.html#calendar.setfirstweekday), чтобы установить первый день недели на воскресенье (6) или любой другой день недели. Параметры, задающие даты, передаются в виде целых чисел. За дополнительными возможностями обращайтесь также к модулям [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime) и [`time`](https://python-all.ru/3.7/library/time.html#module-time).1415Функции и классы, определённые в этом модуле, используют идеализированный календарь – текущий григорианский календарь, неограниченно расширенный в обоих направлениях. Это соответствует определению «пролептического григорианского» календаря из книги Дершовица и Рейнгольда «Calendrical Calculations», где он является базовым для всех вычислений. Нулевые и отрицательные годы интерпретируются в соответствии со стандартом ISO 8601. Год 0 соответствует 1 году до н.э., год -1 – 2 году до н.э. и так далее.1617#### `class calendar.Calendar(firstweekday=0)`1819Создаёт объект [`Calendar`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar). *firstweekday* – целое число, указывающее первый день недели. `0` – понедельник (по умолчанию), `6` – воскресенье.2021Объект [`Calendar`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar) предоставляет несколько методов, которые можно использовать для подготовки данных календаря к форматированию. Этот класс сам не выполняет форматирование – это задача подклассов.2223Экземпляры [`Calendar`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar) имеют следующие методы:2425#### `iterweekdays()`2627Возвращает итератор по номерам дней недели, которые будут использоваться в течение одной недели. Первое значение из итератора будет совпадать со значением свойства [`firstweekday`](https://python-all.ru/3.7/library/calendar.html#calendar.firstweekday).2829#### `itermonthdates(year, month)`3031Возвращает итератор для месяца *month* (1–12) года *year*. Этот итератор вернёт все дни (в виде объектов [`datetime.date`](https://python-all.ru/3.7/library/datetime.html#datetime.date)) за месяц, а также все дни до начала месяца или после его окончания, необходимые для получения полной недели.3233#### `itermonthdays(year, month)`3435Возвращает итератор для месяца *month* года *year*, аналогично [`itermonthdates()`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar.itermonthdates), но без ограничения по диапазону [`datetime.date`](https://python-all.ru/3.7/library/datetime.html#datetime.date). Возвращаемые дни – просто номера дней месяца. Для дней за пределами указанного месяца номер дня равен `0`.3637#### `itermonthdays2(year, month)`3839Возвращает итератор для месяца *month* года *year*, аналогичный [`itermonthdates()`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar.itermonthdates), но не ограниченный [`datetime.date`](https://python-all.ru/3.7/library/datetime.html#datetime.date) диапазоном. Возвращаемые дни – кортежи, состоящие из номера дня в месяце и номера дня недели.4041#### `itermonthdays3(year, month)`4243Возвращает итератор для месяца *month* года *year*, аналогично [`itermonthdates()`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar.itermonthdates), но без ограничения по диапазону [`datetime.date`](https://python-all.ru/3.7/library/datetime.html#datetime.date). Возвращаемые дни будут кортежами из года, месяца и номера дня месяца.4445Добавлено в версии 3.7.4647#### `itermonthdays4(year, month)`4849Возвращает итератор для месяца *month* года *year*, аналогично [`itermonthdates()`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar.itermonthdates), но без ограничения по диапазону [`datetime.date`](https://python-all.ru/3.7/library/datetime.html#datetime.date). Возвращаемые дни будут кортежами из года, месяца, номера дня месяца и номера дня недели.5051Добавлено в версии 3.7.5253#### `monthdatescalendar(year, month)`5455Возвращает список недель в месяце *month* года *year* в виде полных недель. Каждая неделя – список из семи объектов [`datetime.date`](https://python-all.ru/3.7/library/datetime.html#datetime.date).5657#### `monthdays2calendar(year, month)`5859Возвращает список недель в месяце *month* года *year* в виде полных недель. Каждая неделя – это список из семи кортежей с номером дня и номером дня недели.6061#### `monthdayscalendar(year, month)`6263Возвращает список недель в месяце *month* года *year* в виде полных недель. Каждая неделя – это список из семи номеров дней.6465#### `yeardatescalendar(year, width=3)`6667Возвращает данные для указанного года, готовые к форматированию. Возвращаемое значение – это список строк месяцев. Каждая строка месяца содержит до *width* месяцев (по умолчанию 3). Каждый месяц содержит от 4 до 6 недель, а каждая неделя – от 1 до 7 дней. Дни представлены объектами [`datetime.date`](https://python-all.ru/3.7/library/datetime.html#datetime.date).6869#### `yeardays2calendar(year, width=3)`7071Возвращает данные для указанного года, готовые к форматированию (аналогично [`yeardatescalendar()`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar.yeardatescalendar)). Записи в списках недель – это кортежи из номера дня и номера дня недели. Номера дней за пределами этого месяца равны нулю.7273#### `yeardayscalendar(year, width=3)`7475Возвращает данные для указанного года, готовые к форматированию (аналогично [`yeardatescalendar()`](https://python-all.ru/3.7/library/calendar.html#calendar.Calendar.yeardatescalendar)). Записи в списках недель – это номера дней. Номера дней за пределами этого месяца равны нулю.7677#### `class calendar.TextCalendar(firstweekday=0)`7879Этот класс можно использовать для создания текстовых календарей.8081Экземпляры [`TextCalendar`](https://python-all.ru/3.7/library/calendar.html#calendar.TextCalendar) имеют следующие методы:8283#### `formatmonth(theyear, themonth, w=0, l=0)`8485Возвращает календарь месяца в виде многострочной строки. Если указан параметр *w*, он задаёт ширину столбцов с датами, которые центрируются. Если указан параметр *l*, он задаёт количество строк, которое будет занимать каждая неделя. Зависит от первого дня недели, указанного в конструкторе или заданного методом [`setfirstweekday()`](https://python-all.ru/3.7/library/calendar.html#calendar.setfirstweekday).8687#### `prmonth(theyear, themonth, w=0, l=0)`8889Печатает календарь месяца, возвращаемый функцией [`formatmonth()`](https://python-all.ru/3.7/library/calendar.html#calendar.TextCalendar.formatmonth).9091#### `formatyear(theyear, w=2, l=1, c=6, m=3)`9293Возвращает календарь на весь год с *m* столбцами в виде многострочной строки. Необязательные параметры *w*, *l* и *c* задают ширину столбца даты, количество строк на неделю и количество пробелов между столбцами месяцев соответственно. Зависит от первого дня недели, указанного в конструкторе или заданного методом [`setfirstweekday()`](https://python-all.ru/3.7/library/calendar.html#calendar.setfirstweekday). Самый ранний год, для которого можно сгенерировать календарь, зависит от платформы.9495#### `pryear(theyear, w=2, l=1, c=6, m=3)`9697Печатает календарь на весь год, возвращаемый функцией [`formatyear()`](https://python-all.ru/3.7/library/calendar.html#calendar.TextCalendar.formatyear).9899#### `class calendar.HTMLCalendar(firstweekday=0)`100101Этот класс можно использовать для создания HTML-календарей.102103Экземпляры `HTMLCalendar` имеют следующие методы:104105#### `formatmonth(theyear, themonth, withyear=True)`106107Возвращает календарь месяца в виде HTML-таблицы. Если *withyear* равен true, год будет включен в заголовок, иначе будет использовано только название месяца.108109#### `formatyear(theyear, width=3)`110111Возвращает календарь года в виде HTML-таблицы. *width* (по умолчанию 3) задает количество месяцев в строке.112113#### `formatyearpage(theyear, width=3, css='calendar.css', encoding=None)`114115Возвращает календарь года в виде полной HTML-страницы. *width* (по умолчанию 3) задает количество месяцев в строке. *css* – это имя используемой каскадной таблицы стилей. [`None`](https://python-all.ru/3.7/library/constants.html#None) можно передать, если таблица стилей не нужна. *encoding* задает кодировку для вывода (по умолчанию используется системная кодировка).116117`HTMLCalendar` имеет следующие атрибуты, которые можно переопределить для настройки CSS-классов, используемых календарем:118119#### `cssclasses`120121Список CSS-классов, используемых для каждого дня недели. Список классов по умолчанию:122123```python124cssclasses = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]125```126127для каждого дня можно добавить больше стилей:128129```python130cssclasses = ["mon text-bold", "tue", "wed", "thu", "fri", "sat", "sun red"]131```132133Обратите внимание, что длина этого списка должна быть равна семи элементам.134135#### `cssclass_noday`136137CSS-класс для дня недели, приходящегося на предыдущий или следующий месяц.138139Добавлено в версии 3.7.140141#### `cssclasses_weekday_head`142143Список CSS-классов, используемых для названий дней недели в строке заголовка. По умолчанию такой же, как [`cssclasses`](https://python-all.ru/3.7/library/calendar.html#calendar.HTMLCalendar.cssclasses).144145Добавлено в версии 3.7.146147#### `cssclass_month_head`148149CSS-класс заголовка месяца (используется `formatmonthname()`). Значение по умолчанию – `"month"`.150151Добавлено в версии 3.7.152153#### `cssclass_month`154155CSS-класс для таблицы целого месяца (используется [`formatmonth()`](https://python-all.ru/3.7/library/calendar.html#calendar.HTMLCalendar.formatmonth)). Значение по умолчанию – `"month"`.156157Добавлено в версии 3.7.158159#### `cssclass_year`160161CSS-класс для таблицы таблиц всего года (используется [`formatyear()`](https://python-all.ru/3.7/library/calendar.html#calendar.HTMLCalendar.formatyear)). Значение по умолчанию – `"year"`.162163Добавлено в версии 3.7.164165#### `cssclass_year_head`166167CSS-класс для заголовка таблицы всего года (используется [`formatyear()`](https://python-all.ru/3.7/library/calendar.html#calendar.HTMLCalendar.formatyear)). Значение по умолчанию – `"year"`.168169Добавлено в версии 3.7.170171Обратите внимание, что, хотя названия описанных выше атрибутов классов стоят в единственном числе (например, `cssclass_month` `cssclass_noday`), можно заменить одиночный CSS-класс на список CSS-классов, разделенных пробелами, например:172173```python174"text-bold text-red"175```176177Вот пример того, как можно настроить `HTMLCalendar`:178179```python180class CustomHTMLCal(calendar.HTMLCalendar):181 cssclasses = [style + " text-nowrap" for style in182 calendar.HTMLCalendar.cssclasses]183 cssclass_month_head = "text-center month-head"184 cssclass_month = "text-center month"185 cssclass_year = "text-italic lead"186```187188#### `class calendar.LocaleTextCalendar(firstweekday=0, locale=None)`189190Этот подкласс [`TextCalendar`](https://python-all.ru/3.7/library/calendar.html#calendar.TextCalendar) может принимать название локали в конструкторе и возвращать названия месяцев и дней недели в указанной локали. Если эта локаль включает кодировку, все строки, содержащие названия месяцев и дней недели, будут возвращены в виде Unicode.191192#### `class calendar.LocaleHTMLCalendar(firstweekday=0, locale=None)`193194Этот подкласс [`HTMLCalendar`](https://python-all.ru/3.7/library/calendar.html#calendar.HTMLCalendar) может принимать название локали в конструкторе и возвращать названия месяцев и дней недели в указанной локали. Если эта локаль включает кодировку, все строки, содержащие названия месяцев и дней недели, будут возвращены в виде Unicode.195196> **Примечание**197>198> Методы `formatweekday()` и `formatmonthname()` этих двух классов временно изменяют текущую локаль на указанную *locale*. Поскольку текущая локаль является общепроцессной настройкой, они не являются потокобезопасными.199200Для простых текстовых календарей этот модуль предоставляет следующие функции.201202#### `calendar.setfirstweekday(weekday)`203204Устанавливает день недели (`0` – понедельник, `6` – воскресенье), с которого начинается каждая неделя. Для удобства предоставлены значения `MONDAY`, `TUESDAY`, `WEDNESDAY`, `THURSDAY`, `FRIDAY`, `SATURDAY` и `SUNDAY`. Например, чтобы первым днём недели было воскресенье:205206```python207import calendar208calendar.setfirstweekday(calendar.SUNDAY)209```210211#### `calendar.firstweekday()`212213Возвращает текущую настройку дня недели, с которого начинается каждая неделя.214215#### `calendar.isleap(year)`216217Возвращает [`True`](https://python-all.ru/3.7/library/constants.html#True), если *year* – високосный год, иначе [`False`](https://python-all.ru/3.7/library/constants.html#False).218219#### `calendar.leapdays(y1, y2)`220221Возвращает количество високосных лет в диапазоне от *y1* до *y2* (не включая), где *y1* и *y2* – это годы.222223Эта функция работает для диапазонов, охватывающих смену столетий.224225#### `calendar.weekday(year, month, day)`226227Возвращает день недели (`0` – понедельник) для *year* (`1970`–…), *month* (`1`–`12`), *day* (`1`–`31`).228229#### `calendar.weekheader(n)`230231Возвращает заголовок, содержащий сокращённые названия дней недели. *n* задаёт ширину в символах для одного дня недели.232233#### `calendar.monthrange(year, month)`234235Возвращает день недели первого дня месяца и количество дней в месяце для указанных *year* и *month*.236237#### `calendar.monthcalendar(year, month)`238239Возвращает матрицу, представляющую календарь месяца. Каждая строка представляет неделю; дни вне месяца представлены нулями. Каждая неделя начинается с понедельника, если не задано иное с помощью [`setfirstweekday()`](https://python-all.ru/3.7/library/calendar.html#calendar.setfirstweekday).240241#### `calendar.prmonth(theyear, themonth, w=0, l=0)`242243Выводит календарь на месяц, возвращаемый функцией [`month()`](https://python-all.ru/3.7/library/calendar.html#calendar.month).244245#### `calendar.month(theyear, themonth, w=0, l=0)`246247Возвращает календарь на месяц в виде многострочной строки с помощью `formatmonth()` класса [`TextCalendar`](https://python-all.ru/3.7/library/calendar.html#calendar.TextCalendar).248249#### `calendar.prcal(year, w=0, l=0, c=6, m=3)`250251Выводит календарь на целый год, возвращаемый функцией [`calendar()`](https://python-all.ru/3.7/library/calendar.html#module-calendar).252253#### `calendar.calendar(year, w=2, l=1, c=6, m=3)`254255Возвращает календарь на целый год в три колонки в виде многострочной строки с помощью `formatyear()` класса [`TextCalendar`](https://python-all.ru/3.7/library/calendar.html#calendar.TextCalendar).256257#### `calendar.timegm(tuple)`258259Не связанная напрямую, но удобная функция, которая принимает кортеж времени, например возвращаемый функцией [`gmtime()`](https://python-all.ru/3.7/library/time.html#time.gmtime) из модуля [`time`](https://python-all.ru/3.7/library/time.html#module-time), и возвращает соответствующее значение метки времени Unix, предполагая эпоху 1970 года и кодировку POSIX. На самом деле, [`time.gmtime()`](https://python-all.ru/3.7/library/time.html#time.gmtime) и [`timegm()`](https://python-all.ru/3.7/library/calendar.html#calendar.timegm) являются обратными друг другу.260261Модуль [`calendar`](https://python-all.ru/3.7/library/calendar.html#module-calendar) экспортирует следующие атрибуты данных:262263#### `calendar.day_name`264265Массив, представляющий дни недели в текущей локали.266267#### `calendar.day_abbr`268269Массив, представляющий сокращённые названия дней недели в текущей локали.270271#### `calendar.month_name`272273Массив, представляющий месяцы года в текущей локали. Это соответствует общепринятому соглашению, по которому январь – месяц номер 1, поэтому длина массива равна 13, а `month_name[0]` – пустая строка.274275#### `calendar.month_abbr`276277Массив, представляющий сокращённые названия месяцев года в текущей локали. По общепринятому соглашению январь – месяц номер 1, поэтому он имеет длину 13, а `month_abbr[0]` – пустая строка.278279> **См. также**280>281> **Модуль [`datetime`](https://python-all.ru/3.7/library/datetime.html#module-datetime)**282>283> Объектно-ориентированный интерфейс для работы с датами и временем, предоставляющий функциональность, аналогичную модулю [`time`](https://python-all.ru/3.7/library/time.html#module-time).284>285> **Модуль [`time`](https://python-all.ru/3.7/library/time.html#module-time)**286>287> Низкоуровневые функции для работы со временем.288