Python datetime 模块

date, time, datetime, timedelta and timezone — the object model behind date handling.

Intermediate
Key PointsFour types, one rule: keep everything timezone-aware in UTC inside the system, convert only at the edges.

Four Core Types

TypeHoldsExample
dateYear-month-daydate(2026, 10, 31)
timeHour-minute-secondtime(9, 30)
datetimeBothdatetime(2026, 10, 31, 9, 30)
timedeltaA durationtimedelta(days=7)
Python
from datetime import date, datetime, time, timedelta

d = date(2026, 10, 31)
print(d.year, d.month, d.day, d.weekday())     # 2026 10 31 5(周六)

dt = datetime(2026, 10, 31, 9, 30, 15)
print(dt.isoformat())
print(dt.date(), dt.time())
Output
2026 10 31 5
2026-10-31T09:30:15
2026-10-31 09:30:15

Arithmetic

datetime - datetime gives a timedelta; adding one shifts the date. Month arithmetic needs dateutil.relativedelta.

Python
from datetime import datetime, timedelta

start = datetime(2026, 10, 1)
print(start + timedelta(days=30))
print((datetime(2026, 12, 31) - start).days)

from dateutil.relativedelta import relativedelta
print(start + relativedelta(months=1))     # 11-01
Output
2026-10-31 00:00:00
91
2026-11-01 00:00:00

Timezone

A datetime without tzinfo is naive — it does not know which zone it is in. In multi-zone systems that is the classic data incident.

Python
from datetime import datetime, timezone, timedelta

utc = datetime.now(timezone.utc)
cst = utc.astimezone(timezone(timedelta(hours=8)))
print(utc.strftime("%H:%M"), cst.strftime("%H:%M"))

naive = datetime(2026, 10, 31, 1, 30)
aware = naive.replace(tzinfo=timezone.utc)
print(aware.astimezone(timezone(timedelta(hours=8))).hour)
Output
02:40 10:40
9
Store aware UTC in the database; convert only for display. Comparing aware with naive raises TypeError.

Friends & Partners