核心模块:datetime
datetime 模块提供了处理日期和时间的类,我们先从最常用的类开始。

a. datetime 类
这个类结合了日期和时间信息。
创建当前日期和时间
from datetime import datetime
# 获取当前的本地日期和时间
now = datetime.now()
print(f"当前本地时间: {now}")
# 获取当前的UTC (Coordinated Universal Time) 时间
utc_now = datetime.utcnow()
print(f"当前UTC时间: {utc_now}")
输出示例:
当前本地时间: 2025-10-27 15:30:00.123456
当前UTC时间: 2025-10-27 07:30:00.123456
注意:
datetime.now()返回一个包含微秒(6位小数)的datetime对象。datetime.utcnow()不会应用时区转换。
创建特定的日期和时间
你可以通过指定年、月、日、时、分、秒、微秒来创建一个 datetime 对象。

from datetime import datetime
# 创建一个特定的日期和时间
dt = datetime(2025, 10, 27, 10, 30, 0)
print(f"特定时间: {dt}")
# 也可以只指定日期,时分秒会默认为0
dt_date_only = datetime(2025, 10, 27)
print(f"仅日期: {dt_date_only}")
从 datetime 对象中提取信息
datetime 对象有很多有用的属性来获取年、月、日等信息。
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 45, 30, 500000)
print(f"年份: {dt.year}")
print(f"月份: {dt.month}")
print(f"日期: {dt.day}")
print(f"小时: {dt.hour}")
print(f"分钟: {dt.minute}")
print(f"秒: {dt.second}")
print(f"微秒: {dt.microsecond}")
print(f"星期几 (0是周一, 6是周日): {dt.weekday()}") # 注意:weekday() 返回 0-6
print(f"星期几 (1是周一, 7是周日): {dt.isoweekday()}") # isoweekday() 返回 1-7
print(f"ISO格式的年份和周数: {dt.isocalendar()}")
格式化输出 (strftime)
将 datetime 对象格式化为字符串。
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 45, 30)
# 常见格式化代码
# %Y: 4位年份 (e.g., 2025)
# %m: 2位月份 (01-12)
# %d: 2位日期 (01-31)
# %H: 24小时制小时 (00-23)
# %I: 12小时制小时 (01-12)
# %M: 分钟 (00-59)
# %S: 秒 (00-59)
# %A: 星期全名
# %a: 星期缩写
# %B: 月份全名
# %b: 月份缩写
formatted_str1 = dt.strftime("%Y-%m-%d %H:%M:%S")
print(f"标准格式: {formatted_str1}")
formatted_str2 = dt.strftime("%Y年%m月%d日 %A")
print(f"中文友好格式: {formatted_str2}")
输出示例:
标准格式: 2025-10-27 15:45:30
中文友好格式: 2025年10月27日 Friday
从字符串解析日期 (strptime)
将字符串解析为 datetime 对象。

from datetime import datetime
date_string = "2025-10-27 15:45:30"
# 格式字符串必须与日期字符串完全匹配
dt = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"解析后的datetime对象: {dt}")
print(f"其类型是: {type(dt)}")
b. date 类
只处理日期(年、月、日),不包含时间。
创建当前日期
from datetime import date
today = date.today()
print(f"今天的日期: {today}")
创建特定的日期
from datetime import date
d = date(2025, 10, 27)
print(f"特定日期: {d}")
从 datetime 对象获取 date 对象
from datetime import datetime, date
dt = datetime.now()
d = dt.date()
print(f"从datetime中提取的日期: {d}")
print(f"其类型是: {type(d)}")
格式化和解析
date 类也有 strftime 和 strptime 方法,但只包含日期相关的格式代码。
from datetime import date
d = date(2025, 10, 27)
# 格式化
formatted_str = d.strftime("%Y/%m/%d")
print(f"格式化日期: {formatted_str}")
# 解析
date_string = "2025/10/27"
d_parsed = date.strptime(date_string, "%Y/%m/%d")
print(f"解析后的日期: {d_parsed}")
c. time 类
只处理时间(时、分、秒、微秒),不包含日期。
创建特定时间
from datetime import time
# 创建一个时间对象
t = time(10, 30, 45, 500000)
print(f"特定时间: {t}")
从 datetime 对象获取 time 对象
from datetime import datetime, time
dt = datetime.now()
t = dt.time()
print(f"从datetime中提取的时间: {t}")
print(f"其类型是: {type(t)}")
时间差和计算:timedelta
timedelta 对象用于表示两个日期或时间之间的差值,或者用于进行日期/时间的加减运算。
创建 timedelta 对象
from datetime import timedelta, datetime, date
# 创建一个7天的时间差
delta_week = timedelta(weeks=7)
print(f"7天时间差: {delta_week}")
# 创建一个10小时30分钟的时间差
delta_hours = timedelta(hours=10, minutes=30)
print(f"10小时30分钟时间差: {delta_hours}")
# 可以使用天、秒、微秒作为参数
# 1天 = 24 * 3600 秒
delta_days = timedelta(days=5, seconds=3600) # 5天零1小时
print(f"5天零1小时时间差: {delta_days}")
日期/时间的加减运算
这是 timedelta 最强大的功能。
from datetime import datetime, timedelta
now = datetime.now()
# 计算未来3天的日期
future_date = now + timedelta(days=3)
print(f"3天后的日期和时间: {future_date}")
# 计算2小时前的时间
past_time = now - timedelta(hours=2)
print(f"2小时前的时间: {past_time}")
# 计算两个日期之间的差值
d1 = date(2025, 1, 1)
d2 = date(2025, 10, 27)
delta = d2 - d1
print(f"从 {d1} 到 {d2} 相差: {delta}")
print(f"相差的天数: {delta.days}") # timedelta 对象的 .days 属性
print(f"相差的秒数: {delta.total_seconds()}") # .total_seconds() 方法
时区处理:pytz 和 Python 3.9+ 的 zoneinfo
处理时区是编程中的一个常见痛点,在 Python 3.9 之前,最流行的是第三方库 pytz,从 Python 3.9 开始,标准库中引入了更现代的 zoneinfo 模块。
推荐方式 (Python 3.9+): zoneinfo
# 需要 Python 3.9+
from datetime import datetime
from zoneinfo import ZoneInfo
# 创建一个带有时区的 datetime 对象
# 'Asia/Shanghai' 是 IANA 时区数据库中的时区标识符
shanghai_time = datetime.now(ZoneInfo("Asia/Shanghai"))
print(f"上海时间: {shanghai_time}")
# 创建一个特定时间并指定时区
new_york_time = datetime(2025, 10, 27, 10, 0, 0, tzinfo=ZoneInfo("America/New_York"))
print(f"纽约时间: {new_york_time}")
# 时区转换
# 先创建一个带有时区的对象
shanghai_dt = datetime.now(ZoneInfo("Asia/Shanghai"))
# 转换为 UTC 时间
utc_dt = shanghai_dt.astimezone(ZoneInfo("UTC"))
print(f"上海时间转为UTC时间: {utc_dt}")
# 转换为纽约时间
ny_dt = shanghai_dt.astimezone(ZoneInfo("America/New_York"))
print(f"上海时间转为纽约时间: {ny_dt}")
旧方式 (Python 3.8 及以下): pytz
如果你使用的是旧版本 Python,需要先安装 pytz:pip install pytz
# 需要 pip install pytz
from datetime import datetime
import pytz
# 获取时区对象
tz_sh = pytz.timezone('Asia/Shanghai')
tz_ny = pytz.timezone('America/New_York')
# 创建带有时区的 datetime 对象
shanghai_time = datetime.now(tz_sh)
print(f"上海时间: {shanghai_time}")
# 时区转换
utc_time = shanghai_time.astimezone(pytz.UTC)
print(f"上海时间转为UTC时间: {utc_time}")
ny_time = shanghai_time.astimezone(tz_ny)
print(f"上海时间转为纽约时间: {ny_time}")
总结与最佳实践
- 基本操作:优先使用
datetime、date、time和timedelta。datetime.now()获取当前时间,datetime.strptime()解析字符串,datetime.strftime()格式化输出。 - 日期计算:使用
timedelta进行日期和时间的加减运算。 - 时区处理:
- Python 3.9+:强烈推荐使用标准库
zoneinfo,它更符合现代标准。 - Python 3.8 及以下:使用第三方库
pytz。 - 最佳实践:始终在代码中处理时区,除非有特殊原因,否则不要使用 "naive"(无时区)的
datetime对象,在存储、传输和比较时间时,统一使用 UTC 时间。
- Python 3.9+:强烈推荐使用标准库
- 性能考虑:频繁解析字符串会带来性能开销,如果你的应用需要大量处理日期,可以考虑将日期存储为时间戳(
timestamp()方法)或 ISO 8601 格式的字符串,在需要时再进行解析。
