Python 강좌 / 날짜·시간·시간대 다루기
날짜만 필요하면 date를, 시각과 시간대가 필요하면 datetime과 zoneinfo를 사용합니다. 시간대가 없는 시각과 시간대가 지정된 시각을 구분하고, 저장 기준과 화면 표시 기준을 명확히 정해야 합니다.
날짜·시간 간격·시각의 차이
date는 달력 날짜, datetime은 날짜와 시각, timedelta는 기간을 나타냅니다. naive datetime은 시간대 정보가 없고 aware datetime은 시간대 정보가 있습니다. 같은 09:00이라도 서울과 UTC는 서로 다른 시점일 수 있습니다.
관련 동작과 지원 조건은 Python: zoneinfo에서 확인할 수 있습니다.
사용자가 입력한 날짜는 fromisoformat으로 해석하고 잘못된 날짜는 ValueError로 처리합니다. 날짜에 30일을 더하는 것과 달력상 한 달 뒤는 다르므로 월말 정책을 별도로 정합니다.
업무 날짜 입력과 JSON 표현은 최종 실습: SQLite 기반 지출 관리 프로그램 완성하기에서 사용하는 규칙과 연결됩니다.
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python dates.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
dates.py 파일의 전체 내용입니다.
from datetime import date, datetime, timedelta, timezone
from zoneinfo import ZoneInfo
day = date.fromisoformat("2026-10-17")
print(day + timedelta(days=7))
utc = datetime(2026, 10, 17, 0, 0, tzinfo=timezone.utc)
seoul = utc.astimezone(ZoneInfo("Asia/Seoul"))
print(utc.isoformat())
print(seoul.isoformat())
예상 결과는 다음과 같습니다.
2026-10-24
2026-10-17T00:00:00+00:00
2026-10-17T09:00:00+09:00
시간대 변환과 데이터 준비
astimezone은 같은 시점을 다른 시간대의 표시로 변환합니다. replace(tzinfo=...)는 시각 숫자를 그대로 둔 채 시간대 해석을 붙이므로 일반적인 시간대 변환을 대신하지 않습니다. 출처의 시각이 어느 시간대인지 모르면 정확한 변환을 보장할 수 없습니다.
zoneinfo는 IANA 시간대 데이터를 사용합니다. 시스템 데이터가 없는 Windows 등의 환경에서 ZoneInfoNotFoundError가 나면 가상환경에 python -m pip install tzdata로 데이터를 설치할 수 있습니다. 시간대 정책은 바뀔 수 있으므로 배포 환경의 시간대 데이터도 관리합니다.
시간대 데이터가 없는 환경에서는 아래 실험 전에 python -m pip install tzdata를 실행합니다. 같은 UTC 순간을 astimezone으로 바꾸면 서울 09:00이지만 replace로 서울 시간대를 붙이면 00:00이 유지되어 다른 순간이 됩니다. aware와 naive 값을 빼면 TypeError이므로 기준을 모르는 값을 임의로 UTC라고 붙여 문제를 숨기지 않습니다.
아래 전체 코드를 zones.py로 저장하고 같은 실습 폴더에서 python zones.py로 실행합니다.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc = datetime(2026, 10, 17, 0, 0, tzinfo=timezone.utc)
print(utc.astimezone(ZoneInfo("Asia/Seoul")).isoformat())
print(utc.replace(tzinfo=ZoneInfo("Asia/Seoul")).isoformat())
try:
print(datetime(2026, 10, 17) - utc)
except TypeError:
print("naive and aware cannot be subtracted")
예상 결과:
2026-10-17T09:00:00+09:00
2026-10-17T00:00:00+09:00
naive and aware cannot be subtracted
이 동작과 적용 조건의 공식 설명: Python: zoneinfo data sources
저장 형식과 실습의 확인 기준
거래 시점은 UTC와 오프셋 등 일관된 기준으로 저장하고 사용자 화면에서 필요한 시간대로 표시하는 방식을 검토합니다. 지출 날짜만 의미가 있다면 임의의 자정 시각으로 바꾸는 것보다 날짜 자체로 저장하는 편이 명확할 수 있습니다.
- utc의 시각을 23:00으로 바꾸어 서울에서는 다음 날짜가 되는지 확인합니다.
- 2026-02-30을 날짜로 읽으면 거부되는지 확인합니다.
- naive datetime과 aware datetime을 빼려 하면 오류가 나는 이유를 설명합니다.




