09-扩展知识——08. timedelta 类
08. timedelta 类 - 时间差概述timedelta类表示两个日期或时间之间的差值持续时间。它支持天、秒、微秒级别的精度是时间运算的核心工具。维度内容What表示时间差/持续时间的类Why计算时间间隔、日期偏移、倒计时When时间加减、时间差计算、超时判断Wherefrom datetime import timedeltaWho需要进行时间运算的开发者Howtd timedelta(days5, hours3)1. timedelta 基础1.1 参数详解timedelta支持以下参数所有参数都是可选的默认值为 0参数说明示例days天数timedelta(days5)seconds秒数timedelta(seconds3600)microseconds微秒数timedelta(microseconds500000)milliseconds毫秒数自动转换timedelta(milliseconds1000)minutes分钟数自动转换timedelta(minutes30)hours小时数自动转换timedelta(hours2)weeks周数自动转换timedelta(weeks1)fromdatetimeimporttimedelta# 各种创建方式td1timedelta(days5,hours3,minutes30)td2timedelta(weeks2,seconds3600)td3timedelta(milliseconds1500)# 等同于 1.5 秒print(ftd1:{td1})# 5 days, 3:30:00print(ftd2:{td2})# 14 days, 1:00:00print(ftd3:{td3})# 0:00:01.5000001.2 最小和最大时间差fromdatetimeimporttimedelta# 最小时间差1微秒min_tdtimedelta.resolutionprint(f最小时间差:{min_td})# 0:00:00.000001# 最大时间差max_tdtimedelta(days999999999,seconds86399,microseconds999999)print(f最大时间差:{max_td})# 999999999 days, 23:59:59.9999992. timedelta 属性fromdatetimeimporttimedelta tdtimedelta(days5,hours3,minutes30,seconds15,microseconds500000)# 注意这些属性是归一化后的值print(f天数:{td.days})# 5print(f秒数部分:{td.seconds})# 12615 (3*3600 30*60 15)print(f微秒部分:{td.microseconds})# 5000002.1 归一化规则fromdatetimeimporttimedelta# 秒数超过 86400 会自动进位到天td1timedelta(seconds90000)print(td1)# 1 day, 1:00:00# 微秒超过 1000000 会自动进位到秒td2timedelta(microseconds1500000)print(td2)# 0:00:01.500000# 负值归一化td3timedelta(days-1,seconds3600)print(td3)# -1 day, 1:00:00 (实际是 -23:00:00)# 获取实际总秒数td4timedelta(days-1,seconds3600)print(f总秒数:{td4.total_seconds()})# -82800.03. timedelta 方法3.1 total_seconds() - 总秒数fromdatetimeimporttimedelta tdtimedelta(days5,hours3,minutes30,seconds15)# 总秒数total_sectd.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.154. timedelta 运算4.1 算术运算fromdatetimeimporttimedelta td1timedelta(days5,hours3)td2timedelta(days2,hours5)# 加法print(f加法:{td1td2})# 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# 取模td3timedelta(hours10)td4timedelta(hours3)print(f取模:{td3%td4})# 1:00:00# 取反print(f取反:{-td1})# -5 days, 21:00:00# 绝对值print(f绝对值:{abs(-td1)})# 5 days, 3:00:004.2 比较运算fromdatetimeimporttimedelta td1timedelta(days5)td2timedelta(days10)td3timedelta(days5)print(ftd1 td2:{td1td2})# Trueprint(ftd1 td2:{td1td2})# Falseprint(ftd1 td3:{td1td3})# Trueprint(ftd1 ! td2:{td1!td2})# True5. 与 datetime/date 的运算5.1 datetime timedeltafromdatetimeimportdatetime,timedelta nowdatetime(2026,4,19,9,30,0)# 未来时间futurenowtimedelta(days7,hours3)pastnow-timedelta(days3,hours2)print(f现在:{now})print(f7天3小时后:{future})print(f3天2小时前:{past})5.2 date timedeltafromdatetimeimportdate,timedelta todaydate(2026,4,19)# 未来日期tomorrowtodaytimedelta(days1)yesterdaytoday-timedelta(days1)next_weektodaytimedelta(weeks1)print(f今天:{today})print(f明天:{tomorrow})print(f昨天:{yesterday})print(f下周:{next_week})5.3 datetime 差值fromdatetimeimportdatetime startdatetime(2026,4,19,9,0,0)enddatetime(2026,4,19,17,30,0)diffend-startprint(f时间差:{diff})# 8:30:00print(f天数:{diff.days})# 0print(f秒数部分:{diff.seconds})# 30600print(f总秒数:{diff.total_seconds()})# 30600.06. 实用示例6.1 倒计时fromdatetimeimportdatetime,timedeltadefcountdown(target_date):计算倒计时nowdatetime.now()remainingtarget_date-nowifremaining.total_seconds()0:return时间已到daysremaining.days hoursremaining.seconds//3600minutes(remaining.seconds%3600)//60secondsremaining.seconds%60returnf剩余:{days}天{hours}小时{minutes}分钟{seconds}秒# 示例距离2027年元旦targetdatetime(2027,1,1,0,0,0)print(countdown(target))6.2 超时判断fromdatetimeimportdatetime,timedeltadefis_timeout(start_time,timeout_seconds):判断是否超时elapseddatetime.now()-start_timereturnelapsed.total_seconds()timeout_seconds# 示例startdatetime.now()# 模拟耗时操作importtime time.sleep(2)ifis_timeout(start,1):print(操作超时)else:print(操作完成)6.3 日期范围生成器fromdatetimeimportdate,timedeltadefdate_range(start_date,end_date):生成日期范围currentstart_datewhilecurrentend_date:yieldcurrent currenttimedelta(days1)# 示例startdate(2026,4,1)enddate(2026,4,7)fordindate_range(start,end):print(d.strftime(%Y-%m-%d %A))6.4 时间格式化fromdatetimeimporttimedeltadefformat_duration(td):格式化时间差为可读字符串daystd.days hourstd.seconds//3600minutes(td.seconds%3600)//60secondstd.seconds%60parts[]ifdays0:parts.append(f{days}天)ifhours0:parts.append(f{hours}小时)ifminutes0:parts.append(f{minutes}分钟)ifseconds0ornotparts:parts.append(f{seconds}秒)return .join(parts)# 示例tdtimedelta(days5,hours3,minutes30,seconds15)print(format_duration(td))# 5天 3小时 30分钟 15秒6.5 工作日计算fromdatetimeimportdate,timedeltadefadd_workdays(start_date,days):添加工作日跳过周末currentstart_date added0whileaddeddays:currenttimedelta(days1)ifcurrent.weekday()5:# 周一到周五added1returncurrentdefworkdays_between(start_date,end_date):计算两个日期之间的工作日数days0currentstart_datewhilecurrentend_date:ifcurrent.weekday()5:days1currenttimedelta(days1)returndays# 示例startdate(2026,4,1)enddate(2026,4,30)print(f4月工作日数:{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)td1timedelta(days5)td2timedelta(hours3,minutes30)td3timedelta(weeks2)print(f5天:{td1})print(f3.5小时:{td2})print(f2周:{td3})# 2. 运算print(\n2. timedelta 运算)print(f加法:{td1td2})print(f乘法:{td1*3})print(f总秒数:{td2.total_seconds()}秒)# 3. 与 datetime 结合print(\n3. 与 datetime 结合)nowdatetime.now()futurenowtimedelta(days30)pastnow-timedelta(days7)print(f现在:{now})print(f30天后:{future})print(f7天前:{past})# 4. 时间差print(\n4. 时间差计算)startdatetime(2026,4,19,9,0,0)enddatetime(2026,4,19,17,30,0)diffend-startprint(f工作时长:{diff})print(f总分钟:{diff.total_seconds()/60:.0f}分钟)# 5. 实用功能print(\n5. 实用功能)todaydate.today()week_latertodaytimedelta(weeks1)print(f一周后:{week_later})print(f一周后是星期:{week_later.strftime(%A)})8. 常见陷阱陷阱说明解决方案属性归一化seconds和microseconds是归一化后的值使用total_seconds()获取总秒数负值表示负的 timedelta 显示为-1 day, 23:00:00使用total_seconds()获取实际值月份运算timedelta 不支持月份使用dateutil.relativedelta或自定义函数精度限制最小单位是微秒需要更高精度时使用其他库9. 总结操作方法示例创建timedelta(days5, hours3)5天3小时总秒数total_seconds()获取浮点数秒数属性days,seconds,microseconds归一化后的值运算,-,*,/,%算术运算比较,,比较大小