C.W.K.
Stream
Lesson 03 of 06 · published

datetime — 날짜 / 시간 / 타임존

~22 min · datetime, timezone, isoformat, strftime

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

4 핵심 타입

date — 시간 없는 달력 날짜. time — 날짜 없는 시계 시간. datetime — 둘 다. timedelta — 기간 (양/음). 코드 대부분이 datetimetimedelta 사용, 다른 거 덜 나옴.

Naive vs aware — 타임존 구분

"naive" datetime 은 타임존 정보 없음. "aware" datetime 은 tzinfo 붙어있음. 산술에서 섞으면 raise. 2020 년대 답 — 항상 aware datetime 사용. datetime.now(timezone.utc) 또는 문자열에 타임존 있는 datetime.fromisoformat 으로 생성. zoneinfo 모듈 (3.9+) 이 IANA 이름 zone 위한 ZoneInfo("Asia/Seoul").

ISO 8601 lifeline

datetime.fromisoformat("2026-05-02T15:30:00+09:00") 가 파싱, dt.isoformat() 이 emit. round-trip 가능, 문자열로 정렬 가능, 모호 X. 현대 코드는 직렬화에 ISO 8601 디폴트. strftime/strptime 가 다른 포맷 처리, 해야만 할 때만 손에 닿아.

timedelta — 기간 + 산술

timedelta(days=7, hours=3) 가 기간. datetime - datetime = timedelta. datetime + timedelta = datetime. 비교 작동. 흔한 idiom — "지금부터 30 일" 엔 now + timedelta(days=30).

원칙: datetime 은 UTC 오프셋 가진 ISO 8601 문자열로 저장 + 전송. 표시할 때만 로컬 시간으로 변환. naive 와 aware 섞기가 가장 흔한 datetime 버그 — 모든 곳에 aware 쓰면 불가능.

Code

생성과 포맷·python
from datetime import datetime, date, time, timedelta, timezone
from zoneinfo import ZoneInfo

# 오늘, 지금
print(date.today())                # 2026-05-02
print(datetime.now())              # naive — 안 좋음! 현대 코드에선 피해
print(datetime.now(timezone.utc))  # aware — 좋음
print(datetime.now(ZoneInfo("Asia/Seoul")))   # 서울 시간 aware

# 생성
dt = datetime(2026, 5, 2, 15, 30, tzinfo=ZoneInfo("Asia/Seoul"))
print(dt)                          # 2026-05-02 15:30:00+09:00

# ISO 포맷 — 현대 표준
print(dt.isoformat())              # 2026-05-02T15:30:00+09:00
print(datetime.fromisoformat("2026-05-02T15:30:00+09:00"))   # round-trip
Naive vs aware — 구분이 중요한 이유·python
from datetime import datetime, timezone
from zoneinfo import ZoneInfo

naive = datetime(2026, 5, 2, 15, 30)
aware = datetime(2026, 5, 2, 15, 30, tzinfo=timezone.utc)

# 산술에서 섞으면 raise
try:
    aware - naive
except TypeError as e:
    print("실패:", e)

# naive 를 aware 로 변환 (UTC 가정)
aware_from_naive = naive.replace(tzinfo=timezone.utc)
print(aware - aware_from_naive)        # 0 — 같은 순간

# aware 를 다른 zone 으로
seoul = aware.astimezone(ZoneInfo("Asia/Seoul"))
print(seoul)                            # 2026-05-03 00:30:00+09:00
timedelta — 날짜 산술·python
from datetime import datetime, timedelta, timezone

now = datetime.now(timezone.utc)
in_a_week = now + timedelta(days=7)
yesterday = now - timedelta(days=1)

print(in_a_week - now)                  # 7 days, 0:00:00
print(now - yesterday)                  # 1 day, 0:00:00

# 총 초
delta = in_a_week - now
print(delta.total_seconds())           # 604800

# 컴포넌트
print(delta.days)                       # 7
print(timedelta(hours=25).days)         # 1   — 시간이 일로 overflow
strftime / strptime — non-ISO 포맷·python
from datetime import datetime

dt = datetime(2026, 5, 2, 15, 30)

# strftime — datetime to 문자열
print(dt.strftime("%Y-%m-%d"))          # 2026-05-02
print(dt.strftime("%B %d, %Y"))         # May 02, 2026
print(dt.strftime("%I:%M %p"))          # 03:30 PM

# strptime — 문자열 to datetime
parsed = datetime.strptime("05/02/2026 15:30", "%m/%d/%Y %H:%M")
print(parsed)

# 가능하면 fromisoformat 선호. 못 바꿀 non-ISO 포맷에만 strptime.
흔한 연산 — 일 차이, 요일 이름, weekday·python
from datetime import date, timedelta

birthday = date(2025, 6, 15)
today = date.today()

diff = (today - birthday).days
print(f"생일부터 {diff} 일")

# 요일 — 0=월요일, 6=일요일
print(today.weekday())                  # int
print(["월", "화", "수", "목", "금", "토", "일"][today.weekday()])

# strftime 으로 요일 이름
print(today.strftime("%A"))             # 'Saturday' (또는 뭐든)

# 다음 월요일 찾기
days_until_monday = (7 - today.weekday()) % 7 or 7
print(today + timedelta(days=days_until_monday))

External links

Exercise

(a) UTC 와 Asia/Seoul 둘 다의 현재 시간 + 차이 출력 (9 시간이어야). zoneinfo.ZoneInfo 사용. (b) 오늘부터 정확히 100 일 후 날짜 계산. ISO 포맷으로 출력. (c) 문자열 "2026-12-25T10:00:00+09:00"fromisoformat 으로 파싱 + 지금부터 그 datetime 까지 며칠 출력.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.