한양과학기술고등학교

에듀테크 프로젝트 대시보드

날짜와 시간

datetime timedelta strftime strptime zoneinfo

datetime 모듈의 date·time·datetime·timedelta 네 가지가 핵심.

1. 현재 시각 · 생성

from datetime import datetime, date, time, timedelta

datetime.now()               # 로컬 현재 시각
date.today()                 # 오늘 날짜
datetime(2024, 1, 15, 14, 30)
date(2024, 1, 15)

now = datetime.now()
now.year, now.month, now.day, now.hour
now.weekday()                # 월=0 … 일=6
now.date(); now.time()

2. 문자열 ↔ 날짜

dt = datetime.strptime("2024-01-15 14:30", "%Y-%m-%d %H:%M")   # 파싱
dt.strftime("%Y년 %m월 %d일 (%a)")                              # 포맷

datetime.now().isoformat()          # '2024-01-15T14:30:00.123'
datetime.fromisoformat("2024-01-15T14:30:00")

date.today().strftime("%Y%m%d")     # => '20240115' 
코드의미예
%Y / %y연도 4자리 / 2자리2024 / 24
%m %d월 / 일 (0채움)01 15
%H %M %S시(24) 분 초14 30 00
%I %p시(12) / AM·PM02 PM
%A %a요일 전체 / 축약Monday / Mon
%j연중 일수015

3. timedelta — 기간 연산

from datetime import timedelta
now = datetime.now()

tomorrow = now + timedelta(days=1)
last_week = now - timedelta(weeks=1)
deadline = now + timedelta(hours=3, minutes=30)

diff = deadline - now        # timedelta
diff.days
diff.total_seconds()         # 전체 초 (float)

# 두 날짜 사이 일수
(date(2024, 12, 31) - date(2024, 1, 1)).days   # => 365

4. 타임존

from datetime import datetime, timezone
from zoneinfo import ZoneInfo            # 3.9+

utc_now = datetime.now(timezone.utc)     # aware datetime
seoul = utc_now.astimezone(ZoneInfo("Asia/Seoul"))
ny = seoul.astimezone(ZoneInfo("America/New_York"))

# naive (tz 정보 없음) vs aware — 섞어서 빼면 TypeError
dt = datetime(2024, 1, 1, tzinfo=ZoneInfo("Asia/Seoul"))
권장
  • 저장·전송은 UTC aware 로, 표시할 때만 로컬 타임존으로 변환
  • naive datetime 은 "로컬"이라 가정되지만 애매함 — 가능하면 aware 사용

5. time 모듈 · 성능 측정

import time
time.time()               # Unix epoch 초 (float)
time.sleep(0.5)           # 0.5초 대기

start = time.perf_counter()      # 고해상도 (경과 측정 전용)
do_work()
elapsed = time.perf_counter() - start

time.strftime("%Y-%m-%d", time.localtime())

6. epoch 변환

ts = datetime.now().timestamp()          # datetime → epoch
datetime.fromtimestamp(ts)               # epoch → 로컬 datetime
datetime.fromtimestamp(ts, timezone.utc) # epoch → UTC datetime
"There should be one — and preferably only one — obvious way to do it"