datetime 模块提供了用于处理日期和时间的类,它允许你轻松地操作、格式化和显示日期和时间信息。

核心类
datetime 模块主要包含以下几个核心类,你需要先了解它们:
| 类 | 描述 | 示例 |
|---|---|---|
datetime |
最常用的类,同时包含日期和时间信息。 | 2025-10-27 15:30:00 |
date |
只包含日期信息(年、月、日)。 | 2025-10-27 |
time |
只包含时间信息(时、分、秒、微秒)。 | 15:30:00 |
timedelta |
表示两个日期或时间之间的时间差或持续时间。 | timedelta(days=7) |
tzinfo |
时区信息的抽象基类,通常使用其子类 timezone。 |
UTC, +08:00 |
获取当前日期和时间
这是最常见的操作。
获取当前日期和时间 (datetime.now())
返回一个包含本地时区信息的 datetime 对象。
from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前日期和时间: {now}")
print(f"类型: {type(now)}")
# 输出结果示例 (取决于你运行代码的时间和地点):
# 当前日期和时间: 2025-10-27 10:30:55.123456
# 类型: <class 'datetime.datetime'>
获取当前日期 (date.today())
返回一个 date 对象,只包含年、月、日。

from datetime import date
# 获取当前的日期
today = date.today()
print(f"当前日期: {today}")
print(f"类型: {type(today)}")
# 输出结果示例:
# 当前日期: 2025-10-27
# 类型: <class 'datetime.date'>
创建特定的日期和时间对象
你可以通过构造函数来创建一个特定的 datetime、date 或 time 对象。
创建 datetime 对象
格式: datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)
from datetime import datetime
# 创建一个特定的日期和时间
# 注意:月份是 1-12,小时是 0-23
dt = datetime(2025, 10, 27, 15, 30, 0)
print(f"自定义的日期和时间: {dt}")
# 输出: 自定义的日期和时间: 2025-10-27 15:30:00
创建 date 对象
格式: date(year, month, day)
from datetime import date
# 创建一个特定的日期
d = date(2025, 1, 1)
print(f"自定义的日期: {d}")
# 输出: 自定义的日期: 2025-01-01
创建 time 对象
格式: time(hour=0, minute=0, second=0, microsecond=0)

from datetime import time
# 创建一个特定的时间
t = time(9, 45, 30)
print(f"自定义的时间: {t}")
# 输出: 自定义的时间: 09:45:30
格式化输出 (strftime)
strftime (string format time) 方法可以将 datetime 或 date 对象格式化为字符串。
| 格式代码 | 描述 | 示例 |
|---|---|---|
%Y |
4位数的年份 | 2025 |
%y |
2位数的年份 | 23 |
%m |
2位数的月份 (01-12) | 10 |
%B |
月份的完整名称 | October |
%b |
月份的缩写 | Oct |
%d |
2位数的日 (01-31) | 27 |
%A |
星期的完整名称 | Friday |
%a |
星期的缩写 | Fri |
%H |
24小时制的小时 (00-23) | 15 |
%I |
12小时制的小时 (01-12) | 03 |
%M |
分钟 (00-59) | 30 |
%S |
秒 (00-59) | 05 |
%p |
AM 或 PM | PM |
%f |
微秒 (000000-999999) | 123456 |
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 30, 5)
# 格式化为常见的字符串格式
formatted_str1 = dt.strftime("%Y-%m-%d %H:%M:%S")
print(f"标准格式: {formatted_str1}") # 输出: 标准格式: 2025-10-27 15:30:05
# 格式化为更友好的格式
formatted_str2 = dt.strftime("%B %d, %Y at %I:%M %p")
print(f"友好格式: {formatted_str2}") # 输出: 友好格式: October 27, 2025 at 03:30 PM
# 中文格式
formatted_str3 = dt.strftime("%Y年%m月%d日 %H时%M分")
print(f"中文格式: {formatted_str3}") # 输出: 中文格式: 2025年10月27日 15时30分
解析字符串为日期时间 (strptime)
strptime (string parse time) 是 strftime 的逆操作,它可以将符合特定格式的字符串解析为 datetime 对象。
from datetime import datetime
date_string = "2025-10-27 15:30:00"
# 将字符串解析为 datetime 对象
# 第一个参数是字符串,第二个参数是字符串的格式
dt_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"解析后的对象: {dt_object}")
print(f"类型: {type(dt_object)}")
# 输出:
# 解析后的对象: 2025-10-27 15:30:00
# 类型: <class 'datetime.datetime'>
注意: strptime 的格式代码必须和字符串的格式完全匹配,否则会抛出 ValueError。
日期和时间的计算 (timedelta)
timedelta 对象用于表示两个日期或时间之间的差值,并可以用来进行加减运算。
获取时间差
from datetime import datetime, timedelta
now = datetime.now()
# 创建一个7天后的时间点
future_time = now + timedelta(days=7)
# 创建一个2小时前的时间点
past_time = now - timedelta(hours=2)
print(f" {now}")
print(f"7天后: {future_time}")
print(f"2小时前: {past_time}")
计算两个日期之间的差值
from datetime import datetime
# 定义两个日期
date1 = datetime(2025, 1, 1)
date2 = datetime(2025, 10, 27)
# 计算差值,结果是一个 timedelta 对象
delta = date2 - date1
print(f"日期差: {delta}")
print(f"相差的天数: {delta.days}")
print(f"相差的秒数: {delta.total_seconds()}") # total_seconds() 包含所有天数换算成的秒数
# 输出:
# 日期差: 301 days, 0:00:00
# 相差的天数: 301
# 相差的秒数: 26006400.0
访问和修改组件
datetime 对象的各个组件(年、月、日等)可以通过属性来访问,并且是不可变的(immutable),如果你想修改,需要创建一个新的对象。
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 30, 0)
# 访问组件
print(f"年份: {dt.year}")
print(f"月份: {dt.month}")
print(f"日: {dt.day}")
print(f"小时: {dt.hour}")
# 输出:
# 年份: 2025
# 月份: 10
# 日: 27
# 小时: 15
# 修改组件 (需要创建新对象)
# 将年份改为2025
new_dt = dt.replace(year=2025)
print(f"修改后的日期: {new_dt}")
# 输出: 修改后的日期: 2025-10-27 15:30:00
时区处理 (timezone)
datetime 模块也支持时区处理,这对于处理跨时区的应用非常重要。
from datetime import datetime, timezone, timedelta
# 获取当前带时区的 UTC 时间
utc_now = datetime.now(timezone.utc)
print(f"UTC 时间: {utc_now}")
# 创建一个带有时区信息的 datetime 对象
# 创建一个东八区 (UTC+8) 的时区
tz_eastern = timezone(timedelta(hours=8))
dt_with_tz = datetime(2025, 10, 27, 15, 30, 0, tzinfo=tz_eastern)
print(f"东八区时间: {dt_with_tz}")
# 将一个无时区的 datetime 对象转换为有时区的对象
# (推荐使用 astimezone)
naive_dt = datetime(2025, 10, 27, 15, 30, 0)
aware_dt = naive_dt.astimezone(timezone.utc)
print(f"无时区 -> UTC: {aware_dt}")
重要提示:
- “Naive” (天真) 的
datetime对象不包含时区信息。 - “Aware” (感知) 的
datetime对象包含时区信息。 - 在处理跨时区数据时,强烈建议始终使用 Aware 对象,以避免混淆和错误。
datetime 模块是 Python 中处理日期和时间的基础,掌握以下核心操作就足以应对绝大多数场景:
- 获取时间:
datetime.now(),date.today() - 创建时间:
datetime(...),date(...) - 格式化输出:
strftime()(对象 -> 字符串) - 解析字符串:
strptime()(字符串 -> 对象) - 时间计算: 使用
timedelta进行加减 - 访问属性:
.year,.month,.day等 - 修改属性:
.replace()方法 (创建新对象) - 时区: 使用
timezone和astimezone()处理时区问题,尽量使用 Aware 对象。
