当前位置: 首页 > news >正文

09-扩展知识——08. timedelta 类

08. timedelta 类 - 时间差

概述

timedelta类表示两个日期或时间之间的差值(持续时间)。它支持天、秒、微秒级别的精度,是时间运算的核心工具。

维度内容
What表示时间差/持续时间的类
Why计算时间间隔、日期偏移、倒计时
When时间加减、时间差计算、超时判断
Wherefrom datetime import timedelta
Who需要进行时间运算的开发者
Howtd = timedelta(days=5, hours=3)

1. timedelta 基础

1.1 参数详解

timedelta支持以下参数,所有参数都是可选的,默认值为 0:

参数说明示例
days天数timedelta(days=5)
seconds秒数timedelta(seconds=3600)
microseconds微秒数timedelta(microseconds=500000)
milliseconds毫秒数(自动转换)timedelta(milliseconds=1000)
minutes分钟数(自动转换)timedelta(minutes=30)
hours小时数(自动转换)timedelta(hours=2)
weeks周数(自动转换)timedelta(weeks=1)
fromdatetimeimporttimedelta# 各种创建方式td1=timedelta(days=5,hours=3,minutes=30)td2=timedelta(weeks=2,seconds=3600)td3=timedelta(milliseconds=1500)# 等同于 1.5 秒print(f"td1:{td1}")# 5 days, 3:30:00print(f"td2:{td2}")# 14 days, 1:00:00print(f"td3:{td3}")# 0:00:01.500000

1.2 最小和最大时间差

fromdatetimeimporttimedelta# 最小时间差(1微秒)min_td=timedelta.resolutionprint(f"最小时间差:{min_td}")# 0:00:00.000001# 最大时间差max_td=timedelta(days=999999999,seconds=86399,microseconds=999999)print(f"最大时间差:{max_td}")# 999999999 days, 23:59:59.999999

2. timedelta 属性

fromdatetimeimporttimedelta td=timedelta(days=5,hours=3,minutes=30,seconds=15,microseconds=500000)# 注意:这些属性是归一化后的值print(f"天数:{td.days}")# 5print(f"秒数部分:{td.seconds}")# 12615 (3*3600 + 30*60 + 15)print(f"微秒部分:{td.microseconds}")# 500000

2.1 归一化规则

fromdatetimeimporttimedelta# 秒数超过 86400 会自动进位到天td1=timedelta(seconds=90000)print(td1)# 1 day, 1:00:00# 微秒超过 1000000 会自动进位到秒td2=timedelta(microseconds=1500000)print(td2)# 0:00:01.500000# 负值归一化td3=timedelta(days=-1,seconds=3600)print(td3)# -1 day, 1:00:00 (实际是 -23:00:00)# 获取实际总秒数td4=timedelta(days=-1,seconds=3600)print(f"总秒数:{td4.total_seconds()}")# -82800.0

3. timedelta 方法

3.1 total_seconds() - 总秒数

fromdatetimeimporttimedelta td=timedelta(days=5,hours=3,minutes=30,seconds=15)# 总秒数total_sec=td.total_seconds()print(f"总秒数:{total_sec}")# 5*86400 + 3*3600 + 30*60 + 15 = 444615.0# 转换为其他单位print(f"总分钟:{total_sec/60:.2f}")# 7410.25print(f"总小时:{total_sec/3600:.2f}")# 123.50print(f"总天数:{total_sec/86400:.2f}")# 5.15

4. timedelta 运算

4.1 算术运算

fromdatetimeimporttimedelta td1=timedelta(days=5,hours=3)td2=timedelta(days=2,hours=5)# 加法print(f"加法:{td1+td2}")# 7 days, 8:00:00# 减法print(f"减法:{td1-td2}")# 2 days, 22:00:00# 乘法print(f"乘法:{td1*2}")# 10 days, 6:00:00# 除法print(f"除法:{td1/2}")# 2 days, 13:30:00print(f"整除:{td1//2}")# 2 days, 13:30:00# 取模td3=timedelta(hours=10)td4=timedelta(hours=3)print(f"取模:{td3%td4}")# 1:00:00# 取反print(f"取反:{-td1}")# -5 days, 21:00:00# 绝对值print(f"绝对值:{abs(-td1)}")# 5 days, 3:00:00

4.2 比较运算

fromdatetimeimporttimedelta td1=timedelta(days=5)td2=timedelta(days=10)td3=timedelta(days=5)print(f"td1 < td2:{td1<td2}")# Trueprint(f"td1 > td2:{td1>td2}")# Falseprint(f"td1 == td3:{td1==td3}")# Trueprint(f"td1 != td2:{td1!=td2}")# True

5. 与 datetime/date 的运算

5.1 datetime + timedelta

fromdatetimeimportdatetime,timedelta now=datetime(2026,4,19,9,30,0)# 未来时间future=now+timedelta(days=7,hours=3)past=now-timedelta(days=3,hours=2)print(f"现在:{now}")print(f"7天3小时后:{future}")print(f"3天2小时前:{past}")

5.2 date + timedelta

fromdatetimeimportdate,timedelta today=date(2026,4,19)# 未来日期tomorrow=today+timedelta(days=1)yesterday=today-timedelta(days=1)next_week=today+timedelta(weeks=1)print(f"今天:{today}")print(f"明天:{tomorrow}")print(f"昨天:{yesterday}")print(f"下周:{next_week}")

5.3 datetime 差值

fromdatetimeimportdatetime start=datetime(2026,4,19,9,0,0)end=datetime(2026,4,19,17,30,0)diff=end-startprint(f"时间差:{diff}")# 8:30:00print(f"天数:{diff.days}")# 0print(f"秒数部分:{diff.seconds}")# 30600print(f"总秒数:{diff.total_seconds()}")# 30600.0

6. 实用示例

6.1 倒计时

fromdatetimeimportdatetime,timedeltadefcountdown(target_date):"""计算倒计时"""now=datetime.now()remaining=target_date-nowifremaining.total_seconds()<=0:return"时间已到!"days=remaining.days hours=remaining.seconds//3600minutes=(remaining.seconds%3600)//60seconds=remaining.seconds%60returnf"剩余:{days}{hours}小时{minutes}分钟{seconds}秒"# 示例:距离2027年元旦target=datetime(2027,1,1,0,0,0)print(countdown(target))

6.2 超时判断

fromdatetimeimportdatetime,timedeltadefis_timeout(start_time,timeout_seconds):"""判断是否超时"""elapsed=datetime.now()-start_timereturnelapsed.total_seconds()>timeout_seconds# 示例start=datetime.now()# 模拟耗时操作importtime time.sleep(2)ifis_timeout(start,1):print("操作超时!")else:print("操作完成")

6.3 日期范围生成器

fromdatetimeimportdate,timedeltadefdate_range(start_date,end_date):"""生成日期范围"""current=start_datewhilecurrent<=end_date:yieldcurrent current+=timedelta(days=1)# 示例start=date(2026,4,1)end=date(2026,4,7)fordindate_range(start,end):print(d.strftime("%Y-%m-%d %A"))

6.4 时间格式化

fromdatetimeimporttimedeltadefformat_duration(td):"""格式化时间差为可读字符串"""days=td.days hours=td.seconds//3600minutes=(td.seconds%3600)//60seconds=td.seconds%60parts=[]ifdays>0:parts.append(f"{days}天")ifhours>0:parts.append(f"{hours}小时")ifminutes>0:parts.append(f"{minutes}分钟")ifseconds>0ornotparts:parts.append(f"{seconds}秒")return" ".join(parts)# 示例td=timedelta(days=5,hours=3,minutes=30,seconds=15)print(format_duration(td))# 5天 3小时 30分钟 15秒

6.5 工作日计算

fromdatetimeimportdate,timedeltadefadd_workdays(start_date,days):"""添加工作日(跳过周末)"""current=start_date added=0whileadded<days:current+=timedelta(days=1)ifcurrent.weekday()<5:# 周一到周五added+=1returncurrentdefworkdays_between(start_date,end_date):"""计算两个日期之间的工作日数"""days=0current=start_datewhilecurrent<=end_date:ifcurrent.weekday()<5:days+=1current+=timedelta(days=1)returndays# 示例start=date(2026,4,1)end=date(2026,4,30)print(f"4月工作日数:{workdays_between(start,end)}")print(f"从4月1日加10个工作日:{add_workdays(start,10)}")

7. 完整示例

fromdatetimeimportdatetime,timedelta,dateprint("="*50)print("timedelta 类综合示例")print("="*50)# 1. 创建 timedeltaprint("\n1. 创建 timedelta")td1=timedelta(days=5)td2=timedelta(hours=3,minutes=30)td3=timedelta(weeks=2)print(f"5天:{td1}")print(f"3.5小时:{td2}")print(f"2周:{td3}")# 2. 运算print("\n2. timedelta 运算")print(f"加法:{td1+td2}")print(f"乘法:{td1*3}")print(f"总秒数:{td2.total_seconds()}秒")# 3. 与 datetime 结合print("\n3. 与 datetime 结合")now=datetime.now()future=now+timedelta(days=30)past=now-timedelta(days=7)print(f"现在:{now}")print(f"30天后:{future}")print(f"7天前:{past}")# 4. 时间差print("\n4. 时间差计算")start=datetime(2026,4,19,9,0,0)end=datetime(2026,4,19,17,30,0)diff=end-startprint(f"工作时长:{diff}")print(f"总分钟:{diff.total_seconds()/60:.0f}分钟")# 5. 实用功能print("\n5. 实用功能")today=date.today()week_later=today+timedelta(weeks=1)print(f"一周后:{week_later}")print(f"一周后是星期:{week_later.strftime('%A')}")

8. 常见陷阱

陷阱说明解决方案
属性归一化secondsmicroseconds是归一化后的值使用total_seconds()获取总秒数
负值表示负的 timedelta 显示为-1 day, 23:00:00使用total_seconds()获取实际值
月份运算timedelta 不支持月份使用dateutil.relativedelta或自定义函数
精度限制最小单位是微秒需要更高精度时使用其他库

9. 总结

操作方法示例
创建timedelta(days=5, hours=3)5天3小时
总秒数total_seconds()获取浮点数秒数
属性days,seconds,microseconds归一化后的值
运算+,-,*,/,%算术运算
比较<,>,==比较大小

http://www.jsqmd.com/news/791938/

相关文章:

  • 赔偿出炉了,N+3/N+4!
  • 终极视频加速神器:如何用Video Speed Controller提升300%学习效率
  • 2025届最火的六大AI论文网站解析与推荐
  • 告别虚拟机卡顿:在Windows 11的WSL2里为树莓派4B编译Automotive Grade Linux镜像
  • SITS 2026正式实施倒计时18个月,你的需求团队还在手写PRD?揭秘头部金融科技公司已上线的NL2REQ生产环境架构
  • PostgreSQL 9.2 + PostGIS 2.1 安装后必做的三件事:验证、避坑与第一个空间查询
  • Anylogic建模效率翻倍秘诀:活用‘智能体类型’实现模块化设计与复用
  • C语言程序设计核心详解 函数和预编译命令
  • 一帧贴图片
  • 程序员转大模型,这8个必备框架,新手也能快速落地项目
  • 视频水印怎么去掉?手机电脑去除视频水印教程,2026免费安全方法全汇总 - 科技热点发布
  • 水下压力传感器哪家好 优质源头生产厂家品牌排行榜 - WHSENSORS
  • 应对高并发场景,Taotoken API稳定性架构设计参考
  • 镜像复刻现实 智慧驱动孪生
  • 【管理科学】【财务领域】第四十九篇 企业资本通过金融工具获取资本与通过制造舆论冲突吸引注意力01
  • C语言程序设计核心详解 结构体与链表概要详解
  • WeChatMsg完整指南:如何永久保存并深度分析你的微信聊天记录
  • 麦克风阵列算法笔记之一(心形、超心形与偶极子)
  • 微博视频去水印用什么工具?2026在用的去水印工具推荐,在线工具、软件、小程序全盘点 - 科技热点发布
  • 百度文心一言开发者如何快速接入多模型聚合平台
  • 从学生成绩表到业务报表:实战解析ag-grid行列分组的高级配置项
  • 自动化测试系统TCO优化与PXI架构实战
  • 【C语言】16 位的值,通过几种不同的方式将其拆分为高 8 位和低 8 位
  • 豆包视频怎么去水印?官方去水印方法+实用工具2026全整理,这几种方式亲测好用 - 科技热点发布
  • 2026年4月市场耐用的混凝土厂商推荐,A型轻集料混凝土/轻骨料混凝土/轻集料混凝土,混凝土企业推荐 - 品牌推荐师
  • OpenClaw插件实战:为Telegram审批消息添加一键操作按钮
  • SPT-AKI存档编辑器完整指南:轻松修改你的离线塔科夫游戏数据
  • 5分钟掌握LayerDivider:AI图像分层工具终极指南
  • 告别HTTP轮询:用Qt WebSocket实现实时聊天室(附完整Qt 5.15+代码)
  • Windows与Office终极激活指南:KMS_VL_ALL_AIO智能脚本免费解决方案