calendar — 일반 달력 관련 함수

Unix의 cal 프로그램처럼 달력을 출력할 수 있게 해주고, 달력과 관련된 유용한 추가 함수를 제공하는 모듈이에요.

출처: Python 표준 라이브러리

본문

이 모듈은 Unix cal 프로그램처럼 달력을 출력할 수 있게 해주고, 달력과 관련된 유용한 추가 함수를 제공해요. 기본적으로 이 달력은 월요일을 주의 첫날로, 일요일을 마지막 날로 삼아요(유럽 관례). setfirstweekday()를 사용해 주의 첫날을 일요일(6)이나 다른 요일로 설정할 수 있어요. 날짜를 지정하는 매개변수는 정수로 주어져요. 관련 기능은 datetimetime 모듈도 참고하세요.

이 모듈에 정의된 함수와 클래스는 이상화된 달력, 즉 현재 그레고리력이 양방향으로 무한히 확장된 것을 사용해요. 이는 Dershowitz와 Reingold의 책 "Calendrical Calculations"의 "proleptic Gregorian" 달력 정의와 일치하며, 모든 계산의 기준 달력이에요. 0과 음수 연도는 ISO 8601 표준이 규정한 대로 해석돼요. 연도 0은 기원전 1년, 연도 -1은 기원전 2년 등이에요.

class calendar.Calendar(firstweekday=0)

Calendar 객체를 만들어요. firstweekday는 주의 첫 요일을 지정하는 정수예요. MONDAY는 0(기본값), SUNDAY는 6이에요.

Calendar 객체는 달력 데이터를 포맷팅하기 위해 준비하는 데 사용할 수 있는 여러 메서드를 제공해요. 이 클래스는 포맷팅 자체를 하지 않아요. 그것은 서브클래스의 몫이에요.

Calendar 인스턴스의 메서드와 속성:

  • firstweekday — 주의 첫 요일을 정수(0–6)로. 이 속성은 setfirstweekday()getfirstweekday()로 각각 설정·읽을 수도 있어요.
  • getfirstweekday() — 현재 주의 첫 요일을 int(0–6)로 반환해요. firstweekday 속성을 읽는 것과 동일해요.
  • setfirstweekday(firstweekday) — 주의 첫 요일을 int(0–6)로 전달된 firstweekday로 설정해요. firstweekday 속성을 설정하는 것과 동일해요.
  • iterweekdays() — 한 주에 사용될 요일 번호의 iterator를 반환해요. iterator의 첫 번째 값은 firstweekday 속성의 값과 같아요.
  • itermonthdates(year, month) — 연도 year의 월 month(1–12)에 대한 iterator를 반환해요. 이 iterator는 그 달의 모든 날(datetime.date 객체로)과, 완전한 주를 얻는 데 필요한 월 시작 전이나 월 끝 뒤의 모든 날을 반환해요.
  • itermonthdays(year, month) — 연도 year의 월 month에 대한 itermonthdates()와 비슷한 iterator를 반환하지만 datetime.date 범위에 제한받지 않아요. 반환되는 날은 단순히 월의 날짜 번호예요. 지정된 월 밖의 날은 날짜 번호가 0이에요.
  • itermonthdays2(year, month)itermonthdates()와 비슷하지만 datetime.date 범위에 제한받지 않아요. 반환되는 날은 월의 날짜 번호와 요일 번호로 구성된 튜플이에요.
  • itermonthdays3(year, month)itermonthdates()와 비슷하지만 datetime.date 범위에 제한받지 않아요. 반환되는 날은 연도, 월, 월의 날짜 번호로 구성된 튜플이에요. 3.7 버전에서 추가.
  • itermonthdays4(year, month)itermonthdates()와 비슷하지만 datetime.date 범위에 제한받지 않아요. 반환되는 날은 연도, 월, 월의 날짜, 요일 번호로 구성된 튜플이에요. 3.7 버전에서 추가.
  • monthdatescalendar(year, month) — 연도 year의 월 month에 대한 주들을 완전한 주의 리스트로 반환해요. 주는 7개의 datetime.date 객체 리스트예요.
  • monthdays2calendar(year, month) — 연도 year의 월 month의 주들을 완전한 주의 리스트로 반환해요. 주는 날짜 번호와 요일 번호의 7개 튜플 리스트예요.
  • monthdayscalendar(year, month) — 연도 year의 월 month의 주들을 완전한 주의 리스트로 반환해요. 주는 7개의 날짜 번호 리스트예요.
  • yeardatescalendar(year, width=3) — 지정된 연도의 포맷팅 준비 데이터를 반환해요. 반환값은 월 행의 리스트예요. 각 월 행은 최대 width(기본 3)개의 월을 포함해요. 각 월은 46주를 포함하고 각 주는 17일을 포함해요. 날짜는 datetime.date 객체예요.
  • yeardays2calendar(year, width=3) — 지정된 연도의 포맷팅 준비 데이터를 반환해요(yeardatescalendar()와 유사). 주 리스트의 항목은 날짜 번호와 요일 번호의 튜플이에요. 이 달 밖의 날짜 번호는 0이에요.
  • yeardayscalendar(year, width=3) — 지정된 연도의 포맷팅 준비 데이터를 반환해요(yeardatescalendar()와 유사). 주 리스트의 항목은 날짜 번호예요. 이 달 밖의 날짜 번호는 0이에요.

class calendar.TextCalendar(firstweekday=0)

이 클래스는 평문 텍스트 달력을 생성하는 데 사용할 수 있어요.

TextCalendar 인스턴스의 메서드:

  • formatday(theday, weekday, width) — 주어진 width로 포맷된 단일 날을 나타내는 문자열을 반환해요. theday가 0이면 빈 날을 나타내는 지정된 width의 공백 문자열을 반환해요. weekday 매개변수는 사용되지 않아요.
  • formatweek(theweek, w=0) — 새 줄 없는 단일 주를 문자열로 반환해요. w가 제공되면 가운데 정렬되는 날짜 열의 너비를 지정해요. 생성자에서 지정되거나 setfirstweekday() 메서드로 설정된 주의 첫 요일에 의존해요.
  • formatweekday(weekday, width) — 지정된 width로 포맷된 단일 요일 이름을 나타내는 문자열을 반환해요. weekday 매개변수는 요일을 나타내는 정수로, 0은 월요일이고 6은 일요일이에요.
  • formatweekheader(width) — 각 열에 대해 주어진 width로 포맷된 요일 이름의 헤더 행을 포함한 문자열을 반환해요. 이름은 로케일 설정에 따라 달라지고 지정된 너비로 패딩돼요.
  • formatmonth(theyear, themonth, w=0, l=0) — 달의 달력을 여러 줄 문자열로 반환해요. w가 제공되면 가운데 정렬되는 날짜 열의 너비를 지정해요. l이 주어지면 각 주가 사용할 줄 수를 지정해요. 생성자에서 지정되거나 setfirstweekday()로 설정된 주의 첫 요일에 의존해요.
  • formatmonthname(theyear, themonth, width=0, withyear=True) — 지정된 너비 안에 가운데 정렬된 월 이름을 나타내는 문자열을 반환해요. withyearTrue면 출력에 연도를 포함해요. theyearthemonth 매개변수는 포맷할 이름의 연도와 월을 각각 지정해요.
  • prmonth(theyear, themonth, w=0, l=0)formatmonth()이 반환한 달의 달력을 출력해요.
  • formatyear(theyear, w=2, l=1, c=6, m=3) — 전체 연도의 m-열 달력을 여러 줄 문자열로 반환해요. 선택 매개변수 w, l, c는 각각 날짜 열 너비, 주당 줄 수, 월 열 사이의 공백 수예요. 생성자에서 지정되거나 setfirstweekday()로 설정된 주의 첫 요일에 의존해요. 달력을 생성할 수 있는 가장 이른 연도는 플랫폼에 따라 달라요.
  • pryear(theyear, w=2, l=1, c=6, m=3)formatyear()이 반환한 전체 연도 달력을 출력해요.

class calendar.HTMLCalendar(firstweekday=0)

이 클래스는 HTML 달력을 생성하는 데 사용할 수 있어요.

HTMLCalendar 인스턴스의 메서드:

  • formatmonth(theyear, themonth, withyear=True) — 달의 달력을 HTML 테이블로 반환해요. withyear가 참이면 연도가 헤더에 포함되고, 그렇지 않으면 월 이름만 사용돼요.
  • formatyear(theyear, width=3) — 연도의 달력을 HTML 테이블로 반환해요. width(기본 3)는 행당 월 수를 지정해요.
  • formatyearpage(theyear, width=3, css='calendar.css', encoding=None) — 연도의 달력을 완전한 HTML 페이지로 반환해요. width(기본 3)는 행당 월 수를 지정해요. css는 사용할 CSS 스타일시트의 이름이에요. 스타일시트를 사용하지 않으려면 None을 전달할 수 있어요. encoding은 출력에 사용할 인코딩을 지정해요(기본 시스템 기본 인코딩).
  • formatmonthname(theyear, themonth, withyear=True) — 월 이름을 HTML 테이블 행으로 반환해요. withyear가 참이면 연도가 행에 포함되고, 그렇지 않으면 월 이름만 사용돼요.

달력이 사용하는 CSS 클래스를 커스터마이즈하기 위해 오버라이드할 수 있는 속성:

  • cssclasses — 각 요일에 사용되는 CSS 클래스 리스트. 기본 클래스 리스트는:
    cssclasses = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
    
    각 날에 더 많은 스타일을 추가할 수 있어요:
    cssclasses = ["mon text-bold", "tue", "wed", "thu", "fri", "sat", "sun red"]
    
    이 리스트의 길이는 7개 항목이어야 한다는 점을 참고하세요.
  • cssclass_noday — 이전이나 다음 달에 발생하는 요일의 CSS 클래스. 3.7 버전에서 추가.
  • cssclasses_weekday_head — 헤더 행의 요일 이름에 사용되는 CSS 클래스 리스트. 기본값은 cssclasses와 같아요. 3.7 버전에서 추가.
  • cssclass_month_head — 월의 헤드 CSS 클래스(formatmonthname()에서 사용). 기본값은 month. 3.7 버전에서 추가.
  • cssclass_month — 전체 월 테이블의 CSS 클래스(formatmonth()에서 사용). 기본값은 month. 3.7 버전에서 추가.
  • cssclass_year — 전체 연도 테이블의 테이블(formatyear()에서 사용)의 CSS 클래스. 기본값은 year. 3.7 버전에서 추가.
  • cssclass_year_head — 전체 연도 테이블 헤드의 CSS 클래스(formatyear()에서 사용). 기본값은 year. 3.7 버전에서 추가.

위에서 설명한 클래스 속성의 명명이 단수 형태(예: cssclass_month, cssclass_noday)이지만 단일 CSS 클래스를 공백으로 구분된 CSS 클래스 리스트로 대체할 수 있다는 점을 참고하세요. 예를 들어:

"text-bold text-red"

HTMLCalendar를 커스터마이즈하는 방법의 예:

class CustomHTMLCal(calendar.HTMLCalendar):
    cssclasses = [style + " text-nowrap" for style in
                  calendar.HTMLCalendar.cssclasses]
    cssclass_month_head = "text-center month-head"
    cssclass_month = "text-center month"
    cssclass_year = "text-italic lead"

class calendar.LocaleTextCalendar(firstweekday=0, locale=None)

TextCalendar의 서브클래스로, 생성자에 로케일 이름을 전달할 수 있고 지정된 로케일의 월·요일 이름을 반환해요.

class calendar.LocaleHTMLCalendar(firstweekday=0, locale=None)

HTMLCalendar의 서브클래스로, 생성자에 로케일 이름을 전달할 수 있고 지정된 로케일의 월·요일 이름을 반환해요.

참고: 이 두 클래스의 생성자, formatweekday(), formatmonthname() 메서드는 LC_TIME 로케일을 주어진 로케일로 일시적으로 변경해요. 현재 로케일은 프로세스 전역 설정이므로 이들은 스레드 안전하지 않아요.

간단한 텍스트 달력을 위해 이 모듈은 다음 함수를 제공해요.

calendar.setfirstweekday(firstweekday)

각 주를 시작할 요일(0은 월요일, 6은 일요일)을 설정해요. 편의를 위해 MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY 값이 제공돼요. 예를 들어 주의 첫 요일을 일요일로 설정하려면:

import calendar
calendar.setfirstweekday(calendar.SUNDAY)

calendar.firstweekday()

각 주를 시작할 요일의 현재 설정을 반환해요.

calendar.isleap(year)

year가 윤년이면 True를, 그렇지 않으면 False를 반환해요.

calendar.leapdays(y1, y2)

y1에서 y2까지(배타적) 범위의 윤년 수를 반환해요. y1y2는 연도예요. 이 함수는 세기 전환을 가로지르는 범위에서도 동작해요.

calendar.weekday(year, month, day)

year(1970–…), month(1–12), day(1–31)에 대한 요일(0은 월요일)을 반환해요.

calendar.weekheader(width)

축약된 요일 이름을 포함한 헤더를 반환해요. width는 한 요일의 문자 폭을 지정해요.

calendar.monthrange(year, month)

지정된 연도와 월에 대해, 그 달 첫날의 요일과 그 달의 날짜 수를 반환해요.

calendar.monthcalendar(year, month)

그 달의 달력을 나타내는 행렬을 반환해요. 각 행은 한 주를 나타내고, 달 밖의 날은 0으로 표현돼요. 각 주는 setfirstweekday()로 설정되지 않는 한 월요일로 시작해요.

calendar.prmonth(theyear, themonth, w=0, l=0)

month()이 반환한 달의 달력을 출력해요.

calendar.month(theyear, themonth, w=0, l=0)

TextCalendar 클래스의 formatmonth()을 사용해 달의 달력을 여러 줄 문자열로 반환해요.

calendar.prcal(theyear, w=0, l=0, c=6, m=3)

calendar()이 반환한 전체 연도의 달력을 출력해요.

calendar.calendar(theyear, w=2, l=1, c=6, m=3)

TextCalendar 클래스의 formatyear()을 사용해 전체 연도의 3-열 달력을 여러 줄 문자열로 반환해요.

calendar.timegm(tuple)

관련은 없지만 편리한 함수로, time 모듈의 gmtime() 함수가 반환한 것 같은 시간 튜플을 받아 대응하는 Unix 타임스탬프 값을 반환해요. epoch 1970과 POSIX 인코딩을 가정해요. 실제로 time.gmtime()timegm()은 서로의 역함수예요.

데이터 속성

calendar 모듈은 다음 데이터 속성을 내보내요:

calendar.day_name

현재 로케일의 요일을 나타내는 시퀀스로, 월요일이 날짜 번호 0이에요.

>>> import calendar
>>> list(calendar.day_name)
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

calendar.day_abbr

현재 로케일의 축약된 요일을 나타내는 시퀀스로, Mon이 날짜 번호 0이에요.

>>> import calendar
>>> list(calendar.day_abbr)
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

calendar.MONDAY / calendar.TUESDAY / calendar.WEDNESDAY / calendar.THURSDAY / calendar.FRIDAY / calendar.SATURDAY / calendar.SUNDAY

요일의 별칭으로, MONDAY는 0이고 SUNDAY는 6이에요. 3.12 버전에서 추가.

class calendar.Day

요일을 정수 상수로 정의하는 열거형. 이 열거형의 멤버는 모듈 범위로 MONDAY부터 SUNDAY까지 내보내져요. 3.12 버전에서 추가.

calendar.month_name

현재 로케일의 연중 월을 나타내는 시퀀스. 1월이 월 번호 1인 일반 관례를 따르므로 길이가 13이고 month_name[0]은 빈 문자열이에요.

>>> import calendar
>>> list(calendar.month_name)
['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

calendar.month_abbr

현재 로케일의 축약된 연중 월을 나타내는 시퀀스. 1월이 월 번호 1인 일반 관례를 따르므로 길이가 13이고 month_abbr[0]은 빈 문자열이에요.

>>> import calendar
>>> list(calendar.month_abbr)
['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

calendar.JANUARY / calendar.FEBRUARY / calendar.MARCH / calendar.APRIL / calendar.MAY / calendar.JUNE / calendar.JULY / calendar.AUGUST / calendar.SEPTEMBER / calendar.OCTOBER / calendar.NOVEMBER / calendar.DECEMBER

연중 월의 별칭으로, JANUARY는 1이고 DECEMBER는 12예요. 3.12 버전에서 추가.

class calendar.Month

연중 월을 정수 상수로 정의하는 열거형. 이 열거형의 멤버는 모듈 범위로 JANUARY부터 DECEMBER까지 내보내져요. 3.12 버전에서 추가.

예외

calendar 모듈은 다음 예외를 정의해요:

exception calendar.IllegalMonthError(month)

주어진 월 번호가 1-12(포함) 범위를 벗어나면 발생하는 ValueErrorIndexError의 서브클래스. 3.12 버전 변경: IllegalMonthError는 이제 ValueError의 서브클래스이기도 해요. 새 코드는 IndexError를 잡는 것을 피해야 해요.

  • month — 잘못된 월 번호.

exception calendar.IllegalWeekdayError(weekday)

주어진 요일 번호가 0-6(포함) 범위를 벗어나면 발생하는 ValueError의 서브클래스.

  • weekday — 잘못된 요일 번호.

더 알아보기

  • Module datetimetime 모듈과 유사한 기능을 가진 날짜·시간의 객체 지향 인터페이스.
  • Module time — 저수준 시간 관련 함수.

커맨드라인 사용

2.5 버전에서 추가.

calendar 모듈은 커맨드라인에서 스크립트로 실행되어 달력을 대화형으로 출력할 수 있어요.

python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t {text,html}]
                   [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS]
                   [-f FIRST_WEEKDAY] [year] [month]

예를 들어 2000년의 달력을 출력하려면:

$ python -m calendar 2000

다음 옵션이 받아들여져요:

  • --help, -h — 도움말 메시지를 보여주고 종료.
  • --locale LOCALE, -L LOCALE — 월·요일 이름에 사용할 로케일. 기본값은 영어.
  • --encoding ENCODING, -e ENCODING — 출력에 사용할 인코딩. --locale이 설정되면 --encoding이 필수예요.
  • --type {text,html}, -t {text,html} — 달력을 텍스트 또는 HTML 문서로 터미널에 출력.
  • --first-weekday FIRST_WEEKDAY, -f FIRST_WEEKDAY — 각 주를 시작할 요일. 0(월요일)~6(일요일) 사이의 숫자여야 해요. 기본값은 0. 3.13 버전에서 추가.
  • year — 달력을 출력할 연도. 기본값은 현재 연도.
  • month — 지정된 연도의, 달력을 출력할 월. 1~12 사이의 숫자여야 하고 텍스트 모드에서만 사용할 수 있어요. 기본적으로 전체 연도 달력이 출력돼요.

텍스트 모드 옵션:

  • --width WIDTH, -w WIDTH — 터미널 열에서의 날짜 열 너비. 날짜는 열 안에 가운데 정렬돼요. 2보다 낮은 값은 무시돼요. 기본값은 2.
  • --lines LINES, -l LINES — 터미널 행에서 각 주에 대한 줄 수. 날짜는 위쪽 정렬로 출력돼요. 1보다 낮은 값은 무시돼요. 기본값은 1.
  • --spacing SPACING, -s SPACING — 열 사이의 월 사이 공간. 2보다 낮은 값은 무시돼요. 기본값은 6.
  • --months MONTHS, -m MONTHS — 행당 출력되는 월 수. 기본값은 3.

3.14 버전 변경: 기본적으로 오늘 날짜가 색상으로 강조되며 환경 변수로 제어할 수 있어요.

HTML 모드 옵션:

  • --css CSS, -c CSS — 달력에 사용할 CSS 스타일시트의 경로. 생성된 HTML에 상대적이거나, 절대 HTTP 또는 file:/// URL이어야 해요.