datetime 模块的类
datetime 模块主要提供了以下几个类,理解它们的区别是关键:

| 类名 | 描述 | 示例 |
|---|---|---|
date |
只存储日期(年、月、日),不包含时间信息。 | 2025-10-27 |
time |
只存储时间(时、分、秒、微秒),不包含日期信息。 | 14:30:00 |
datetime |
同时存储日期和时间信息,是最常用的类。 | 2025-10-27 14:30:00 |
timedelta |
表示一个时间间隔或持续时间,用于日期时间的加减运算。 | timedelta(days=7) (7天) |
tzinfo |
时区信息的抽象基类,用于处理不同时区的时间。 |
datetime 类:最常用的操作
1 获取当前时间
使用 datetime.now() 可以获取当前的本地时间。
from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前时间: {now}")
print(f"类型: {type(now)}")
# 输出可能类似于:
# 当前时间: 2025-10-27 15:30:45.123456
# 类型: <class 'datetime.datetime'>
2 创建特定时间的对象
你可以通过 datetime() 构造函数来创建一个你想要的 datetime 对象。
from datetime import datetime
# 创建一个特定的时间
# 格式: datetime(年, 月, 日, 时, 分, 秒, 微秒)
dt = datetime(2025, 10, 27, 10, 30, 0)
print(f"创建的时间: {dt}")
# 也可以只提供年月日,时分秒会默认为0
dt2 = datetime(2025, 1, 1)
print(f"只提供日期: {dt2}")
3 从字符串解析时间
在实际应用中,我们经常需要从字符串(如日志文件、用户输入)中解析出时间。strptime (string parse time) 是完成这个任务的利器。
from datetime import datetime
date_string = "2025-10-26 15:45:30"
# strptime 的第一个参数是字符串,第二个参数是格式化字符串
# %Y: 4位年份, %m: 2位月份, %d: 2位日期, %H: 24小时制, %M: 分钟, %S: 秒
dt = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"解析后的时间: {dt}")
print(f"类型: {type(dt)}")
常用格式化字符:

| 符号 | 含义 | 示例 |
|---|---|---|
%Y |
4位年份 | 2025 |
%y |
2位年份 | 23 |
%m |
2位月份 (01-12) | 10 |
%B |
月份全称 | October |
%b |
月份简称 | Oct |
%d |
2位日期 (01-31) | 27 |
%H |
24小时制小时 (00-23) | 14 |
%I |
12小时制小时 (01-12) | 02 |
%M |
分钟 (00-59) | 30 |
%S |
秒 (00-59) | 05 |
%A |
星期全称 | Friday |
%a |
星期简称 | Fri |
%p |
AM/PM | PM |
4 将 datetime 对象格式化为字符串
与 strptime 相对的是 strftime (string format time),它可以将 datetime 对象转换为你想要的字符串格式。
from datetime import datetime
now = datetime.now()
# 格式化为 YYYY-MM-DD HH:MM:SS
formatted_str1 = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化1: {formatted_str1}")
# 格式化为更友好的中文格式
formatted_str2 = now.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(f"格式化2: {formatted_str2}")
# 格式化为 ISO 8601 标准格式
formatted_str3 = now.isoformat()
print(f"ISO格式: {formatted_str3}")
date 类的操作
date 对象只包含年月日,操作与 datetime 类似。
from datetime import date
# 获取当前日期
today = date.today()
print(f"今天日期: {today}")
# 创建特定日期
my_birthday = date(1990, 5, 20)
print(f"我的生日: {my_birthday}")
# 格式化日期
print(f"格式化: {today.strftime('%Y/%m/%d (%A)')}")
# 从字符串解析日期
date_str = "2025-12-25"
parsed_date = date.fromisoformat(date_str) # fromisoformat 是 ISO 格式 (YYYY-MM-DD) 的快捷方式
print(f"解析的日期: {parsed_date}")
timedelta 类:时间的加减
timedelta 用于表示两个时间点之间的差值,或者给一个时间点增加/减少一个时间间隔。
from datetime import datetime, timedelta
now = datetime.now()
# 计算未来3天后的时间
future_time = now + timedelta(days=3)
print(f"3天后: {future_time}")
# 计算2小时前的时间
past_time = now - timedelta(hours=2)
print(f"2小时前: {past_time}")
# 计算未来1周零2天3小时的时间
delta = timedelta(weeks=1, days=2, hours=3)
future_time2 = now + delta
print(f"1周2天3小时后: {future_time2}")
# 计算两个时间点的差值
time_difference = future_time - now
print(f"时间差: {time_difference}") # 结果是一个 timedelta 对象
print(f"时间差的天数: {time_difference.days}")
print(f"时间差的秒数: {time_difference.seconds}") # 注意:这不会包含天数的总秒数
时区处理 (Time Zones)
处理时区非常重要,尤其是在全球化的应用中,从 Python 3.9 开始,标准库 zoneinfo 是处理时区的推荐方式(更简单,无需安装第三方库)。
1 使用 zoneinfo (Python 3.9+)
from datetime import datetime
from zoneinfo import ZoneInfo # Python 3.9+ 内置
# 获取带时区的当前时间
# 'Asia/Shanghai' 是 IANA 时区数据库的时区名称
shanghai_time = datetime.now(ZoneInfo("Asia/Shanghai"))
new_york_time = datetime.now(ZoneInfo("America/New_York"))
print(f"上海时间: {shanghai_time}")
print(f"纽约时间: {new_york_time}")
# 将一个无时区的时间附加时区
naive_dt = datetime(2025, 10, 27, 10, 0)
aware_dt = naive_dt.replace(tzinfo=ZoneInfo("UTC"))
print(f"UTC时间: {aware_dt}")
# 时区转换
# 确保时间对象是 "aware" (有时区信息) 的
shanghai_to_utc = shanghai_time.astimezone(ZoneInfo("UTC"))
print(f"上海时间转UTC: {shanghai_to_utc}")
2 旧方法:pytz (Python 3.9 之前)
如果你使用的是旧版 Python,你可能需要安装并使用 pytz 库。
pip install pytz
from datetime import datetime
import pytz
# 获取带时区的当前时间
shanghai_time = datetime.now(pytz.timezone('Asia/Shanghai'))
print(f"上海时间 (pytz): {shanghai_time}")
# 时区转换
utc_time = shanghai_time.astimezone(pytz.UTC)
print(f"上海时间转UTC (pytz): {utc_time}")
常用技巧与最佳实践
1 比较 datetime 对象
datetime 对象可以直接进行比较,非常方便。
from datetime import datetime
dt1 = datetime(2025, 1, 1)
dt2 = datetime(2025, 1, 2)
print(f"dt1 < dt2 ? {dt1 < dt2}") # True
print(f"dt1 == dt2 ? {dt1 == dt2}") # False
2 获取 datetime 对象的各个部分
from datetime import datetime
now = datetime.now()
print(f"年份: {now.year}")
print(f"月份: {now.month}")
print(f"日期: {now.day}")
print(f"小时: {now.hour}")
print(f"分钟: {now.minute}")
print(f"秒: {now.second}")
print(f"星期几 (0是周一): {now.weekday()}") # 返回 0-6
print(f"星期几 (1是周一): {now.isoweekday()}") # 返回 1-7
3 dateutil 库:更灵活的解析
datetime.strptime 要求字符串的格式必须完全匹配,如果字符串格式不固定,dateutil 库的 parser.parse 非常强大和智能。
pip install python-dateutil
from dateutil import parser
# 它能智能地解析各种格式的日期字符串
dt1 = parser.parse("Oct 27, 2025")
dt2 = parser.parse("2025/10/27")
dt3 = parser.parse("27th October, 23") # 甚至能处理 '23'
print(dt1)
print(dt2)
print(dt3)
| 任务 | 推荐方法 | 示例 |
|---|---|---|
| 获取当前时间 | datetime.now() |
now = datetime.now() |
| 创建特定时间 | datetime() |
dt = datetime(2025, 10, 27, 10, 30) |
| 字符串转时间 | datetime.strptime() |
dt = datetime.strptime(s, "%Y-%m-%d") |
| 时间转字符串 | strftime() |
s = dt.strftime("%Y年%m月%d日") |
| 时间加减 | timedelta |
future_dt = now + timedelta(days=7) |
| 获取当前日期 | date.today() |
today = date.today() |
| 处理时区 | zoneinfo (Python 3.9+) |
dt = datetime.now(ZoneInfo("Asia/Shanghai")) |
| 智能解析字符串 | dateutil.parser.parse() |
dt = parser.parse("Oct 27, 2025") |
掌握 datetime 模块是 Python 开发者的必备技能,希望这份详细的指南能帮助你!
