Python 강좌 / 날짜·시간·시간대 다루기
날짜만 필요하면 date를, 시각과 시간대가 필요하면 datetime과 zoneinfo를 사용합니다. 시간대가 없는 시각과 시간대가 지정된 시각을 구분하고, 저장 기준과 화면 표시 기준을 명확히 정해야 합니다.
날짜·시간 간격·시각의 차이
date는 달력 날짜, datetime은 날짜와 시각, timedelta는 기간을 나타냅니다. naive datetime은 시간대 정보가 없고 aware datetime은 시간대 정보가 있습니다. 같은 09:00이라도 서울과 UTC는 서로 다른 시점일 수 있습니다.
관련 동작과 지원 조건은 날짜·시간·시간대 다루기 관련 공식 문서에서 확인할 수 있습니다.
사용자가 입력한 날짜는 fromisoformat으로 해석하고 잘못된 날짜는 ValueError로 처리합니다. 날짜에 30일을 더하는 것과 달력상 한 달 뒤는 다르므로 월말 정책을 별도로 정합니다.
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 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로 데이터를 설치할 수 있습니다. 시간대 정책은 바뀔 수 있으므로 배포 환경의 시간대 데이터도 관리합니다.
저장 형식과 실습의 확인 기준
거래 시점은 UTC와 오프셋 등 일관된 기준으로 저장하고 사용자 화면에서 필요한 시간대로 표시하는 방식을 검토합니다. 지출 날짜만 의미가 있다면 임의의 자정 시각으로 바꾸는 것보다 날짜 자체로 저장하는 편이 명확할 수 있습니다.
- utc의 시각을 23:00으로 바꾸어 서울에서는 다음 날짜가 되는지 확인합니다.
- 2026-02-30을 날짜로 읽으면 거부되는지 확인합니다.
- naive datetime과 aware datetime을 빼려 하면 오류가 나는 이유를 설명합니다.




