[python] datetime 날짜/시간 차이 계산하기 – timedelta, relativedelta

이전 글에서 datetime에 대해 간략히 알아봤습니다.
이번 글에서는 날짜/시간의 차이를 계산하는 방법에 대해 알아보겠습니다.

timedelta

날짜/시간의 차이를 계산하기 위해서는 datetime 모듈에서 timedelta 클래스를 사용하면 됩니다.

from datetime import datetime, timedelta

timedelta 클래스는 날짜/시간을 계산하기 위한 클래스로 많이 사용됩니다.

timedelta 사용 예제

예제를 통해서 timedelta의 사용법을 알아보겠습니다.

timedelta는 년, 월을 제외한 주, 일, 시, 분, 초, 마이크로초, 밀리초로 계산이 가능하지만 너무 복잡하게 계산하면 제가 헷갈리므로 날짜 계산 예제만을 다루겠습니다.

아래는 현재로부터 100일 전/후 날짜를 구하는 코드입니다.

# 현재로부터 100일 전/후 날짜 구하기
now = datetime.now()
past = now - timedelta(days=100) # 100일 전
future = now + timedelta(days=100) # 100일 후

print("현재 날짜:", now.strftime("%y-%m-%d"))
print("100일 전:", past.strftime("%y-%m-%d"))
print("100일 후:", future.strftime("%y-%m-%d"))

아래는 올해 몇 일이 지났는지, 남았는지 구하는 코드입니다.

# 올해 몇 일 지났는지/남았는지 구하기
now = datetime.now()
past = datetime(year=now.year, month=1, day=1)
future = datetime(year=now.year+1, month=1, day=1)
elapse = now - past # 경과 일수
remain = future - now # 남은 일수

print("현재 날짜:", now.strftime("%y-%m-%d"))
print(elapse.days, "일 경과")
print(remain.days, "일 남음")

위 코드에서 elapse와 remain은 timedelta 객체입니다.

relativedelta

timedelta는 년, 월 단위로 계산할 수 없습니다. 이런 경우엔 relativedelta 모듈의 relativedelta 클래스를 사용하면 됩니다.

from dateutil.relativedelta import relativedelta # 년/월
relativedelta 사용 예제

아래는 현재로부터 30개월 전/후 날짜를 구하는 코드입니다.

# 현재로부터 30개월 전/후 날짜 구하기
now = datetime.now()
past = now - relativedelta(months=30) # 30개월 전
future = now + relativedelta(months=30) # 30개월 후

print("현재 날짜:", now.strftime("%y-%m-%d"))
print("30개월 전:", past.strftime("%y-%m-%d"))
print("30개월 후:", future.strftime("%y-%m-%d"))

아래는 2020년이 된 이후로 경과한 날과 2030년까지 남은 날을 계산하여 년/개월/일로 표현하는 코드입니다.

now = datetime.now()
# 2020년이 된 이후로 몇 년/개월/일이 경과했는지 계산
past = datetime(year=2020, month=1, day=1)
elapse = relativedelta(now, past)

print("현재 날짜:", now.strftime("%y-%m-%d"))
print("="*5, "2020년 1월 1일 이후로")
print(elapse.years, "년", end=" ")
print(elapse.months, "개월", end=" ")
print(elapse.days, "일 경과함")

# 2020년대는 몇 년/개월/일이 남았는지 계산
future = datetime(year=2030, month=1, day=1)
remain = relativedelta(future, now)

print("="*5, "2030년 1월 1일 까지")
print(remain.years, "년", end=" ")
print(remain.months, "개월", end=" ")
print(remain.days, "일 남음")

relativedelta 주의 사항

relativedelta 클래스의 __init__ 아규먼트 중에는 이름이 서로 비슷한 것들이 있습니다.
예를 들어 year, years 같은 것들입니다. 날짜/시간에 단수, 복수 표현 차이로 보시면 됩니다.

단수: year, month, day, hour, minute, second, microsecond
복수: years, months, weeks, days, hours, minutes, seconds, microseconds

복수로 표현된 것 들은 상대적인 날짜 차이를 계산하는데, 단수로 표현된 것들은 datetime과 연산에서 계산을 하지 않고 replace 개념으로 계산합니다.

# 단수 인자 사용
now = datetime.now()
new_date = now + relativedelta(years=2, months=10, day=1) # days가 아닌 day 사용

print("now:", now.strftime("%y-%m-%d"))
print("new_date:", new_date.strftime("%y-%m-%d"))

years와 months를 사용해서 2년 10개월은 연산이 됐지만, days가 아닌 day를 사용해서 +1이 된 것이 아닌 1이 입력된 것을 볼 수 있습니다.(참고 링크)

이상으로 날짜/시간을 계산하는 방법에 대해 알아보았습니다.