杰瑞科技汇

Python datetime如何进行日期加减运算?

下面我将从基础到高级,详细讲解如何使用 datetimetimedelta

Python datetime如何进行日期加减运算?-图1
(图片来源网络,侵删)

核心概念:datetimetimedelta

  • datetime 对象: 表示一个特定的日期和时间(2025年10月27日 上午10:30)。
  • timedelta 对象: 表示一个时间间隔(10天,5小时,30秒)。

你可以将 timedelta 对象与 datetime 对象进行加减运算,得到一个新的 datetime 对象。


基础加减法

1 加法

使用 运算符,将一个 timedelta 加到 datetime 上。

步骤:

  1. 导入 datetimetimedelta
  2. 创建一个 datetime 对象。
  3. 创建一个 timedelta 对象,指定要增加的时间量。
  4. 将两者相加。

示例代码:

Python datetime如何进行日期加减运算?-图2
(图片来源网络,侵删)
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)

注意:

Python datetime如何进行日期加减运算?-图3
(图片来源网络,侵删)
  • 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 对象之间的减法

除了 datetimetimedelta 之间的加减,你还可以对两个 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 中轻松自如地进行各种日期时间的计算了。

分享:
扫描分享到社交APP
上一篇
下一篇