OkBublewrap

📅 달력 만들기 본문

Python/학습용

📅 달력 만들기

옥뽁뽁 2025. 4. 13. 23:31

패키지 사용 - calendar

import calendar
from datetime import datetime

# 현재 연도와 월 가져오기
today = datetime.today()
year = today.year
month = today.month

# 이번 달 달력 출력
print(calendar.month(year, month))

 

직접 구현

  1. 윤년 판별 함수
  2. 마지막 날짜 계산
  3. 지나온 날짜 계산
  4. 요일 반환
  5. 달력 확인

 

1. 윤년 판별 함수

 

04. 윤년 구하기

[TOC] # 윤년 구하기 레오는 달력을 보다가 2020년에는 2월 29일이 있었는데 2021년에는 2월 29일이 없는 것이 신기했습니다. 다빈이에게 물어보니 윤년이라는 것을 …

wikidocs.net

 

윤년의 규칙

  • 4로 나누어떨어지는 해는 윤년으로 한다 (2016년, 2020년, 2024년 등등)
  • 4와 100으로 나누어떨어지는 해는 평년으로 한다 (1900년, 2100년, 2200년)
  • 4, 100, 400으로 나누어떨어지는 해는 윤년으로 한다 (2000년, 2400년)

➜ 4로 나누어떨어지고 그리고 100으로 나누어떨어지지 않으면 윤년이다.

400으로 나누어떨어지면 윤년이다.

 

# 윤년이면 True, 아니면 False를 출력하는 함수
def isLeapYear(year):
	return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

isLeapYear(2024)
# True

isLeapYear(2025)
# False

 

 

2. 마지막 날짜 계산

def lastDay(year, month):
	m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    # 2월 마지막 날짜 윤년일 경우 29일로
    if isLeapYear(year):
    	m[1] = 29
    
    return m[month - 1] # 마지막 날짜 리턴
    
lastDay(2024, 2)
# 29

 

3. 지나온 날짜 계산

1년 1월 1일 부터 지난 날짜 누적 합계 계산

  1. 평년을 기준으로 전년도까지 일자 합계 ➜ 윤년이었던 횟수 더하기
  2. 전달까지 해당 연도 일자 더하기
  3. 이번달 날짜 더하기
def totalDay(year, month, day):
    """
    1년 1월 1일부터 주어진 날짜까지의 총 누적 일수를 계산하는 함수.
    """

    # 1. 전년도(1년 ~ year-1)까지의 일수 계산
    #    - 기본: 365일 × (year - 1)
    #    - 윤년 보정: + (4년마다 하루) - (100년마다 제외) + (400년마다 다시 윤년)
    total = (year - 1) * 365
    total += (year - 1) // 4
    total -= (year - 1) // 100
    total += (year - 1) // 400

    # 2. 올해의 1월부터 전달까지의 일수 누적
    for m in range(1, month):
        total += lastDay(year, m)

    # 3. 이번 달 day만큼 더해서 총 누적 일수 반환
    return total + day
    
totalDay(2025, 4, 13)
# 739354

 

4. 요일 반환

weekDay 인수로 년, 월, 일을 넘겨받아 요일을 계산해 숫자로 리턴하는 함수

1년 1월 1일 부터 인수로 넘겨받은 년, 월, 일 까지 지난 날짜의 합계를 7로 나눈 나머지 반환

일요일(0), 토요일(6)

def weekDay(year, month, day):
    return totalDay(year, month, day) % 7
    
weekDay(2025, 4, 13) # 일요일
# 0

 

5. 달력 확인

# 달력 프로그램 도입부
year, month = map(int, input('달력을 출력할 년, 월을 입력하세요 : ').split())
print('=' * 28)
print('         {0:4d}년{1:2d}월'.format(year, month))
print('=' * 28)
print(' 일  월  화  수  목  금  토 ')
print('=' * 28)

# 1일이 출력될 요일 위치 맞추기
for i in range(weekDay(year, month, 1)):        
    print('    ', end = '')
    
# 1일 부터 마지막 날짜까지 반복
for i in range(1, lastDay(year, month) + 1):
	print(' {0:2d} '.format(i), end = '')
    
	if weekDay(year, month, i) == 6 and i != lasyDay(year, month):
    	print()
        
    print('\n' + '=' * 28)

 

부가

dateutil

  • parse 함수를 통해 자동으로 날짜 형식을 찾아서 datetime 객체로 변환함
from dateutil.parser import parse
data = '2025-04-13'
parse(date)

# 자동 형식 탐지
parse('Oct 15, 2022 04:05:32 PM")

# 날짜 문자열 자동 탐지
log = "INFO 2022-01-01T00:00:01 New Year!!"
parse(log, fuzzy=True)

 

'Python > 학습용' 카테고리의 다른 글

🔒 암호화  (0) 2025.04.19
🐍 Python 파일 및 디렉터리 처리 완전 정복  (0) 2025.04.12
LLM - Fine-Tuning  (0) 2025.03.21
추천시스템 (3): 협업필터링 실습  (0) 2025.03.21
추천시스템 (2): 협업필터링  (0) 2025.03.21