파이썬 날짜 시간 더하기 빼기 완벽 가이드

파이썬으로 프로젝트를 진행하다 보면 날짜와 시간을 계산해야 하는 순간이 반드시 찾아옵니다. “3일 후는 언제지?”, “지금부터 2시간 30분 전은?” 같은 계산을 손으로 하면 실수하기 쉽죠. 오늘은 파이썬 datetime 모듈로 날짜와 시간을 자유자재로 다루는 방법을 알려드리겠습니다.

파이썬 datetime 기본 개념 이해하기

datetime 모듈은 파이썬 표준 라이브러리에 포함되어 있어 별도 설치 없이 바로 사용할 수 있습니다. 날짜, 시간, 기간 계산에 필요한 모든 기능을 제공하는 강력한 도구입니다.

현재 날짜와 시간 가져오기

import datetime

# 현재 날짜와 시간
current = datetime.datetime.now()
print(f"현재 시간: {current}")
# 출력 예시: 2025-10-04 14:30:25.123456

# 오늘 날짜만
today = datetime.date.today()
print(f"오늘 날짜: {today}")
# 출력 예시: 2025-10-04

timedelta로 날짜 시간 계산하는 핵심 방법

timedelta는 시간의 차이나 기간을 나타내는 객체입니다. 더하기와 빼기 연산으로 쉽게 날짜를 계산할 수 있습니다.

시간 단위별 계산 방법

1. 일(days) 계산하기

import datetime

current = datetime.datetime.now()

# 하루 후
tomorrow = current + datetime.timedelta(days=1)
print(f"내일: {tomorrow}")

# 하루 전
yesterday = current - datetime.timedelta(days=1)
print(f"어제: {yesterday}")

# 일주일 후
next_week = current + datetime.timedelta(days=7)
print(f"일주일 후: {next_week}")

# 30일 전
thirty_days_ago = current - datetime.timedelta(days=30)
print(f"30일 전: {thirty_days_ago}")

2. 시간(hours) 계산하기

import datetime

current = datetime.datetime.now()

# 1시간 후
one_hour_later = current + datetime.timedelta(hours=1)
print(f"1시간 후: {one_hour_later}")

# 1시간 전
one_hour_ago = current - datetime.timedelta(hours=1)
print(f"1시간 전: {one_hour_ago}")

# 12시간 후
twelve_hours_later = current + datetime.timedelta(hours=12)
print(f"12시간 후: {twelve_hours_later}")

# 24시간 전 (하루 전과 동일)
day_ago = current - datetime.timedelta(hours=24)
print(f"24시간 전: {day_ago}")

3. 분(minutes) 계산하기

import datetime

current = datetime.datetime.now()

# 10분 후
ten_minutes_later = current + datetime.timedelta(minutes=10)
print(f"10분 후: {ten_minutes_later}")

# 10분 전
ten_minutes_ago = current - datetime.timedelta(minutes=10)
print(f"10분 전: {ten_minutes_ago}")

# 30분 후
thirty_minutes_later = current + datetime.timedelta(minutes=30)
print(f"30분 후: {thirty_minutes_later}")

# 90분 전 (1시간 30분)
ninety_minutes_ago = current - datetime.timedelta(minutes=90)
print(f"90분 전: {ninety_minutes_ago}")

4. 초(seconds) 계산하기

import datetime

current = datetime.datetime.now()

# 30초 후
thirty_seconds_later = current + datetime.timedelta(seconds=30)
print(f"30초 후: {thirty_seconds_later}")

# 30초 전
thirty_seconds_ago = current - datetime.timedelta(seconds=30)
print(f"30초 전: {thirty_seconds_ago}")

# 3600초 후 (1시간)
hour_later = current + datetime.timedelta(seconds=3600)
print(f"3600초 후: {hour_later}")

여러 단위 동시에 계산하는 실전 활용법

실무에서는 여러 시간 단위를 한 번에 계산해야 하는 경우가 많습니다.

import datetime

current = datetime.datetime.now()

# 2일 3시간 30분 후
complex_time = current + datetime.timedelta(
    days=2,
    hours=3,
    minutes=30
)
print(f"2일 3시간 30분 후: {complex_time}")

# 1주일 12시간 45분 전
past_time = current - datetime.timedelta(
    weeks=1,
    hours=12,
    minutes=45
)
print(f"1주일 12시간 45분 전: {past_time}")

# 90일 6시간 20분 15초 후
specific_time = current + datetime.timedelta(
    days=90,
    hours=6,
    minutes=20,
    seconds=15
)
print(f"정확한 미래 시간: {specific_time}")

특정 날짜 기준으로 계산하기

현재 시간이 아닌 특정 날짜를 기준으로 계산할 수도 있습니다.

import datetime

# 특정 날짜 설정
specific_date = datetime.datetime(2025, 12, 25, 15, 30, 0)
print(f"기준 날짜: {specific_date}")

# 해당 날짜로부터 100일 후
hundred_days_after = specific_date + datetime.timedelta(days=100)
print(f"100일 후: {hundred_days_after}")

# 해당 날짜로부터 2주 전
two_weeks_before = specific_date - datetime.timedelta(weeks=2)
print(f"2주 전: {two_weeks_before}")

날짜 차이 계산하기

두 날짜 사이의 차이를 계산하는 방법입니다.

import datetime

# 두 날짜 설정
date1 = datetime.datetime(2025, 10, 4)
date2 = datetime.datetime(2025, 12, 25)

# 날짜 차이 계산
difference = date2 - date1
print(f"날짜 차이: {difference}")
print(f"일 수: {difference.days}일")
print(f"총 초: {difference.total_seconds()}초")

# 시간 포함 차이 계산
datetime1 = datetime.datetime(2025, 10, 4, 14, 30)
datetime2 = datetime.datetime(2025, 10, 5, 16, 45)

time_diff = datetime2 - datetime1
print(f"시간 차이: {time_diff}")
hours = time_diff.total_seconds() / 3600
print(f"시간으로 환산: {hours}시간")

실무에서 자주 쓰는 날짜 계산 패턴

1. 마감일 계산하기

import datetime

# 오늘부터 14일 후 마감
today = datetime.date.today()
deadline = today + datetime.timedelta(days=14)
print(f"마감일: {deadline}")

# 남은 일수 계산
days_left = (deadline - today).days
print(f"남은 기간: {days_left}일")

2. 업무일 계산 (주말 제외)

import datetime

def add_business_days(start_date, days):
    current = start_date
    added_days = 0

    while added_days < days:
        current += datetime.timedelta(days=1)
        # 월요일(0)부터 금요일(4)까지만 카운트
        if current.weekday() < 5:
            added_days += 1

    return current

today = datetime.date.today()
result = add_business_days(today, 10)
print(f"10 업무일 후: {result}")

3. 월별 데이터 처리

import datetime
from dateutil.relativedelta import relativedelta

current = datetime.datetime.now()

# 1개월 후 (dateutil 사용)
one_month_later = current + relativedelta(months=1)
print(f"1개월 후: {one_month_later}")

# 6개월 전
six_months_ago = current - relativedelta(months=6)
print(f"6개월 전: {six_months_ago}")

날짜 포맷팅으로 보기 좋게 출력하기

계산한 날짜를 원하는 형식으로 출력하는 방법입니다.

import datetime

current = datetime.datetime.now()

# 다양한 형식으로 출력
print(current.strftime("%Y년 %m월 %d일"))
print(current.strftime("%Y-%m-%d %H:%M:%S"))
print(current.strftime("%A, %B %d, %Y"))
print(current.strftime("%p %I:%M"))

# 한국어 요일 처리
weekdays = ['월', '화', '수', '목', '금', '토', '일']
weekday_name = weekdays[current.weekday()]
print(f"{current.year}년 {current.month}월 {current.day}일 {weekday_name}요일")

timedelta 주요 파라미터 정리

timedelta에서 사용할 수 있는 모든 파라미터입니다.

파라미터설명예시
daystimedelta(days=7)
secondstimedelta(seconds=3600)
microseconds마이크로초timedelta(microseconds=1000)
milliseconds밀리초timedelta(milliseconds=500)
minutestimedelta(minutes=30)
hours시간timedelta(hours=12)
weekstimedelta(weeks=2)

자주 하는 실수와 해결 방법

실수 1: date와 datetime 혼용

import datetime

# 잘못된 예시
date_obj = datetime.date.today()
# date 객체는 시간 정보가 없어서 시간 계산 불가
# result = date_obj + datetime.timedelta(hours=1)  # 에러 발생

# 올바른 예시
datetime_obj = datetime.datetime.now()
result = datetime_obj + datetime.timedelta(hours=1)
print(result)

실수 2: 문자열을 날짜로 변환하지 않음

import datetime

# 잘못된 예시
date_string = "2025-10-04"
# result = date_string + datetime.timedelta(days=1)  # 에러 발생

# 올바른 예시
date_obj = datetime.datetime.strptime(date_string, "%Y-%m-%d")
result = date_obj + datetime.timedelta(days=1)
print(result)

실수 3: 월 계산 시 timedelta 사용

# timedelta는 월 단위를 직접 지원하지 않음
# 월마다 일수가 다르기 때문

# 해결책: dateutil.relativedelta 사용
from dateutil.relativedelta import relativedelta
import datetime

current = datetime.datetime.now()
one_month_later = current + relativedelta(months=1)
print(f"정확한 1개월 후: {one_month_later}")

시간대(Timezone) 고려한 계산

글로벌 서비스에서는 시간대를 고려해야 합니다.

import datetime
from zoneinfo import ZoneInfo

# UTC 시간
utc_time = datetime.datetime.now(ZoneInfo("UTC"))
print(f"UTC 시간: {utc_time}")

# 한국 시간
kst_time = datetime.datetime.now(ZoneInfo("Asia/Seoul"))
print(f"한국 시간: {kst_time}")

# 시간대를 고려한 계산
future_time = kst_time + datetime.timedelta(hours=3)
print(f"3시간 후 (KST): {future_time}")

성능 최적화 팁

많은 날짜 계산을 할 때는 성능도 고려해야 합니다.

import datetime

# 반복문에서 datetime.datetime.now() 호출 최소화
start_time = datetime.datetime.now()

# 좋은 예시
for i in range(100):
    future_date = start_time + datetime.timedelta(days=i)
    # 처리 로직

# 나쁜 예시
for i in range(100):
    future_date = datetime.datetime.now() + datetime.timedelta(days=i)
    # 매번 현재 시간을 가져와서 느림

마치며

파이썬 datetime과 timedelta를 활용하면 복잡한 날짜 계산도 간단하게 처리할 수 있습니다. 프로젝트 마감일 계산, 로그 분석, 예약 시스템 등 다양한 분야에서 활용해보세요. 날짜 계산 로직이 명확해지면 코드 가독성과 유지보수성이 크게 향상됩니다.

더 많은 파이썬 팁이 궁금하다면 댓글로 질문해주세요!

참고 자료

댓글 남기기