Menu

파이썬 datetime 완벽 정리: 날짜/시간/타임존 다루기

파이썬 datetime 모듈로 날짜와 시간을 자유자재로 다뤄봅시다. 파싱, 포맷팅, 날짜 계산, 그리고 실무에서 가장 골치 아픈 타임존 처리까지 한 번에 정리했습니다.

핵심 타입 두 가지: date와 datetime

datetime 모듈에서 꼭 알아둘 타입은 네 가지다: date, time, datetime, 그리고 timedelta. 앞의 세 개는 이름만 봐도 뭘 다루는지 감이 오고, 마지막 timedelta는 시간의 간격(길이)을 표현한다.

main.py
Output
Click Run to see the output here.

date는 시계 정보 없이 연·월·일만 담는 날짜 타입이고, datetime은 여기에 시각까지 붙은 타입입니다. 시계가 필요 없다면 date 쪽이 훨씬 깔끔한 선택이죠.

특정 날짜 만들기

직접 생성해 보겠습니다:

main.py
Output
Click Run to see the output here.

dateyear, month, day를, datetime은 여기에 더해 hour, minute, second, microsecond까지 최대 7개의 인자를 받습니다.

필드 값 읽어오기

모든 date/datetime 객체는 다음과 같은 속성을 가지고 있습니다:

main.py
Output
Click Run to see the output here.

isoformat()를 잘 써두면 기계가 읽기 좋은 포맷이 나옵니다. "2026-04-20T09:30:15"처럼 생긴 문자열인데, 다른 시스템에서 파싱할 때 헷갈릴 일이 없어서 편하죠.

strftime으로 날짜 포맷 지정하기

사람이 읽기 좋은 형태로 출력하고 싶다면 .strftime(fmt)을 쓰면 됩니다. 이 메서드는 datedatetime 객체를 원하는 포맷의 문자열로 바꿔줍니다.

main.py
Output
Click Run to see the output here.

자주 쓰이는 포맷 코드만 정리하면 이 정도입니다:

  • %Y — 네 자리 연도 (2026)
  • %m — 월 숫자, 두 자리로 채움 (04)
  • %d — 일, 두 자리로 채움 (20)
  • %H / %I — 시, 24시간제 / 12시간제
  • %M — 분
  • %S — 초
  • %A / %a — 요일 이름 전체 / 축약형 (Monday / Mon)
  • %B / %b — 월 이름 전체 / 축약형 (April / Apr)
  • %p — AM/PM

굳이 외울 필요는 없습니다. 레퍼런스를 북마크해 두고 필요할 때 찾아보면 충분합니다.

strptime으로 문자열 파싱하기

이번엔 반대 방향입니다. 형식이 정해진 문자열을 받아서 datetime 객체로 변환해 볼게요:

main.py
Output
Click Run to see the output here.

포맷 문자열은 입력과 정확히 일치해야 합니다. 그렇지 않으면 strptimeValueError를 발생시킵니다.

기계가 읽기 쉬운 표준인 ISO-8601 형식의 문자열이라면, 최신 파이썬에서는 더 간단한 방법을 쓸 수 있습니다:

main.py
Output
Click Run to see the output here.

날짜 형식이 제각각이라면 외부 패키지인 dateutil(pip install python-dateutil)을 써보세요. parser.parse() 함수가 웬만한 형식은 알아서 잘 파싱해 줍니다.

timedelta로 날짜 계산하기

날짜끼리 더하거나 빼는 연산을 할 때는 timedelta를 사용합니다:

main.py
Output
Click Run to see the output here.

timedelta가 받는 인자는 days, seconds, microseconds, milliseconds, minutes, hours, weeks입니다. monthsyears는 없는데, 달마다 날짜 수가 달라서 그렇습니다. 월 단위나 연 단위 계산이 필요할 땐 dateutil.relativedelta를 사용하세요:

from dateutil.relativedelta import relativedelta
from datetime import date

today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)

타임존: Naive와 Aware의 차이

타임존 정보가 없는 datetimenaive(순진한) 객체라고 부릅니다. 파이썬 입장에서는 이게 어느 타임존을 뜻하는지 알 수 없다는 뜻이죠. 하나의 타임존 안에서만 계산한다면 naive datetime으로도 충분하지만, 서로 다른 타임존의 데이터가 한자리에 모이는 순간부터 문제가 시작됩니다.

반면 aware datetime은 타임존 정보를 같이 들고 다닙니다. 타임존은 이렇게 명시적으로 붙여주면 됩니다:

main.py
Output
Click Run to see the output here.

Python 3.9부터는 시스템의 IANA 데이터베이스를 활용해 시간대를 이름으로 지정할 수 있는 zoneinfo 모듈이 추가되었습니다:

main.py
Output
Click Run to see the output here.

.astimezone()를 사용하면 시간대 간 변환이 가능합니다:

main.py
Output
Click Run to see the output here.

꼭 기억해 둘 만한 원칙이 하나 있습니다. 날짜/시간은 UTC로 저장하고, 화면에 표시할 때만 로컬 시간대로 변환하라는 거죠. 이 습관 하나만 들여도 타임존 관련 버그 대부분은 미리 막을 수 있습니다.

타임스탬프 다루기

유닉스 타임스탬프(Unix timestamp)는 1970년 1월 1일 UTC를 기준으로 흘러간 초(second)를 나타내는 값입니다. 파이썬에서는 간단히 변환할 수 있습니다.

main.py
Output
Click Run to see the output here.

타임스탬프는 값끼리 비교하거나 정렬할 때, 또는 다른 시스템과 데이터를 주고받을 때 유용합니다. 다만 사용자에게 보여줄 때는 먼저 datetime으로 다시 변환해 주는 게 좋습니다.

실행 시간 측정하기

간단하게 시간을 재고 싶다면 두 datetime 값을 빼기만 하면 됩니다:

main.py
Output
Click Run to see the output here.

좀 더 진지하게 성능을 측정할 때는 time.perf_counter()를 쓰는 게 좋습니다. 마이크로초 이하 단위까지 잴 수 있고, 시스템 시계가 바뀌어도 영향을 받지 않거든요. 반면 "이 API 호출이 얼마나 걸렸지?" 정도 수준이면 datetime.now()만으로도 충분합니다.

자주 쓰게 되는 패턴들

main.py
Output
Click Run to see the output here.

핵심 정리

  • 실무의 90%는 date, datetime, timedelta면 충분합니다.
  • 기계가 읽을 데이터는 ISO-8601, 사람이 볼 데이터는 strftime으로 포맷하세요.
  • 저장은 UTC로, 변환은 보여줄 때만 하세요.
  • 타임존 이름을 다룰 때는 zoneinfo를 씁니다.
  • 월 단위, 연 단위 계산에는 dateutil.relativedelta가 답입니다.

실전 도구 상자에 하나 더 추가할 차례입니다. 다음은 정규표현식(regular expressions)입니다.

자주 묻는 질문

현재 날짜와 시간은 어떻게 가져오나요?

datetime.now()를 쓰면 현재 로컬 시각을 돌려줍니다. UTC가 필요하다면 datetime.utcnow()도 있지만, 요즘은 datetime.now(timezone.utc) 쪽이 권장됩니다. utcnow()는 타임존 정보가 없는 naive datetime을 반환하기 때문이에요. 날짜만 필요하다면 date.today()를 쓰면 됩니다.

날짜를 문자열로 포맷팅하려면 어떻게 하나요?

.strftime(format)에 포맷 코드를 넘기면 됩니다. 예를 들어 연-월-일은 %Y-%m-%d예요. datetime.now().strftime('%Y-%m-%d %H:%M')처럼 쓰면 됩니다. 반대로 문자열을 다시 datetime으로 파싱할 때는 같은 포맷 코드를 datetime.strptime(text, format)에 넣어주면 돼요.

날짜에 며칠을 더하려면 어떻게 하나요?

timedelta를 쓰면 됩니다. from datetime import date, timedelta; date.today() + timedelta(days=7) 이런 식으로요. timedelta는 days, hours, minutes, seconds, weeks 등을 지원합니다. 단, 월이나 년 단위 계산은 timedelta로 안 되니까 이럴 땐 외부 라이브러리인 dateutil.relativedelta를 써야 합니다.

Coddy로 코딩 배우기

시작하기