下面我将从基础到高级,详细讲解如何使用 datetime 和 timedelta。

核心概念:datetime 和 timedelta
datetime对象: 表示一个特定的日期和时间(2025年10月27日 上午10:30)。timedelta对象: 表示一个时间间隔(10天,5小时,30秒)。
你可以将 timedelta 对象与 datetime 对象进行加减运算,得到一个新的 datetime 对象。
基础加减法
1 加法
使用 运算符,将一个 timedelta 加到 datetime 上。
步骤:
- 导入
datetime和timedelta。 - 创建一个
datetime对象。 - 创建一个
timedelta对象,指定要增加的时间量。 - 将两者相加。
示例代码:

from datetime import datetime, timedelta
# 1. 创建一个 datetime 对象
now = datetime.now()
print(f"当前时间: {now}")
# 2. 创建一个 timedelta 对象,表示3天5小时30分钟
delta = timedelta(days=3, hours=5, minutes=30)
print(f"时间差: {delta}")
# 3. 加法运算
future_time = now + delta
print(f"3天5小时30分钟后的时间: {future_time}")
# 也可以只增加一个单位
future_time_2 = now + timedelta(days=10)
print(f"10天后的时间: {future_time_2}")
2 减法
使用 运算符,从 datetime 中减去一个 timedelta 对象。
示例代码:
from datetime import datetime, timedelta
now = datetime.now()
print(f"当前时间: {now}")
# 创建一个 timedelta 对象,表示2天
delta = timedelta(days=2)
# 减法运算
past_time = now - delta
print(f"2天前的时间: {past_time}")
# 也可以只减少一个单位
past_time_2 = now - timedelta(hours=5)
print(f"5小时前的时间: {past_time_2}")
timedelta 的参数
timedelta 构造函数非常灵活,可以接受以下参数(所有参数都是可选的,且可以是正数或负数):
| 参数 | 描述 | 示例 |
|---|---|---|
days |
天数 | timedelta(days=5) |
seconds |
秒数 | timedelta(seconds=3600) |
microseconds |
微秒数 | timedelta(microseconds=1000) |
milliseconds |
毫秒数 | timedelta(milliseconds=500) |
minutes |
分钟数 | timedelta(minutes=30) |
hours |
小时数 | timedelta(hours=2) |
weeks |
周数 | timedelta(weeks=1) |
注意:

- 1秒 = 1,000毫秒 = 1,000,000微秒。
- 1周 = 7天。
- 如果传入的参数超出了其正常范围(
seconds=90),它会自动向上进位。timedelta(seconds=90)等价于timedelta(minutes=1, seconds=30)。
示例:
from datetime import datetime, timedelta
now = datetime.now()
# 使用不同单位创建 timedelta
# 1周零2天零3小时零45秒
delta = timedelta(weeks=1, days=2, hours=3, seconds=45)
future_time = now + delta
print(f"计算后的时间: {future_time}")
# 使用负数表示过去
# 往前推1天12小时
past_time = now - timedelta(days=1, hours=-12) # 注意:days=-1, hours=12
print(f"往前推1天12小时: {past_time}")
datetime 对象之间的减法
除了 datetime 和 timedelta 之间的加减,你还可以对两个 datetime 对象进行减法,其结果会是一个 timedelta 对象,这在计算两个时间点之间的间隔时非常有用。
示例代码:
from datetime import datetime
# 创建两个不同的 datetime 对象
time1 = datetime(2025, 1, 1, 12, 0, 0)
time2 = datetime(2025, 1, 10, 15, 30, 0)
# 计算时间差
time_difference = time2 - time1
print(f"时间1: {time1}")
print(f"时间2: {time2}")
print(f"时间差: {time_difference}")
print(f"时间差的类型: {type(time_difference)}")
# 从 time_difference 中提取具体的天数和秒数
print(f"相差天数: {time_difference.days}")
print(f"相差秒数: {time_difference.seconds}") # 注意:这个值只包含除去天数后剩余的秒数
# 获取总秒数
total_seconds = time_difference.total_seconds()
print(f"总秒数: {total_seconds}")
输出解释:
time_difference.days返回完整的整天数(这里是9天)。time_difference.seconds返回除去整天数后剩余的秒数(这里是(15-12)*3600 + 30*60 = 12600秒)。time_difference.total_seconds()返回总的秒数,包括所有天数和剩余秒数(这里是9 * 86400 + 12600 = 790200秒)。
实用技巧和注意事项
1 只获取时间部分或日期部分
当你对一个 datetime 对象加减 timedelta 后,得到的结果仍然是 datetime 对象,如果你只想得到新的日期或时间,可以这样操作:
from datetime import datetime, timedelta
now = datetime.now()
print(f"完整的 datetime: {now}")
# 加一天
new_datetime = now + timedelta(days=1)
print(f"加一天后的 datetime: {new_datetime}")
# 只获取新的日期部分 (date 对象)
new_date = new_datetime.date()
print(f"只获取日期部分: {new_date} (类型: {type(new_date)})")
# 只获取新的时间部分 (time 对象)
new_time = new_datetime.time()
print(f"只获取时间部分: {new_time} (类型: {type(new_time)})")
2 处理时区 (Time Zones)
标准的 datetime 模块是“天真”(naive)的,它不包含时区信息,在处理跨时区的日期时间时,强烈推荐使用第三方库 pytz 或 Python 3.9+ 内置的 zoneinfo 模块。
使用 zoneinfo (Python 3.9+):
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
# 创建一个有时区的 datetime 对象 (纽约时间)
ny_tz = ZoneInfo("America/New_York")
now_in_ny = datetime.now(ny_tz)
print(f"纽约当前时间: {now_in_ny}")
# 加上2小时
future_in_ny = now_in_ny + timedelta(hours=2)
print(f"纽约2小时后: {future_in_ny}")
# 如果需要转换时区
tokyo_tz = ZoneInfo("Asia/Tokyo")
future_in_tokyo = future_in_ny.astimezone(tokyo_tz)
print(f"同一时刻的东京时间: {future_in_tokyo}")
3 计算月份和年份的加减
timedelta 不能直接用于加减月份或年份,因为月份的长度不固定(28, 29, 30, 31天),如果你需要加减月份或年份,可以使用 dateutil 库中的 relativedelta,它非常强大和直观。
示例 (需要先安装 python-dateutil): pip install python-dateutil
from datetime import datetime
from dateutil.relativedelta import relativedelta
now = datetime.now()
print(f"当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}")
# 加上3个月
future_month = now + relativedelta(months=3)
print(f"3个月后: {future_month.strftime('%Y-%m-%d %H:%M:%S')}")
# 加上1年零2周
future_year_week = now + relativedelta(years=1, weeks=2)
print(f"1年2周后: {future_year_week.strftime('%Y-%m-%d %H:%M:%S')}")
# 减去2年零5天
past_year_day = now + relativedelta(years=-2, days=-5)
print(f"2年5天前: {past_year_day.strftime('%Y-%m-%d %H:%M:%S')}")
| 操作 | 符号 | 适用场景 |
|---|---|---|
| 增加时间 | datetime + timedelta |
在某个时间点基础上增加一个固定的时长(如:3天后、5小时后)。 |
| 减少时间 | datetime - timedelta |
在某个时间点基础上减少一个固定的时长(如:1天前、10分钟前)。 |
| 计算间隔 | datetime - datetime |
计算两个时间点之间的时间差,结果为 timedelta 对象。 |
| 月份/年份加减 | datetime + relativedelta |
当需要加减不固定长度的月份或年份时,使用 dateutil.relativedelta。 |
掌握了 timedelta,你就可以在 Python 中轻松自如地进行各种日期时间的计算了。
