Python 中计算当前时间与日出日落时间的秒级时间差方法
解决
datetime.time类型直接相减报TypeError的问题 报错本质
Python标准库的datetime.time类本身没有实现减法运算逻辑——设计上纯时间对象不带日期基准,直接做差会存在跨天的歧义,因此直接对两个同类型的time对象做减法,就会触发你碰到的TypeError。
适配现有代码的计算实现
不需要大改原有切换壁纸的核心逻辑,只要把纯时间值转换为可计算的形式,就能快速拿到两个时间点之间的秒数差,两种常用方案都可以直接套用:
方案1:将纯时间对象转换为当日从0点累计的总秒数,直接做算术差
这个方法改动量最小,不需要引入额外的日期绑定逻辑,计算结果可读性强:def get_seconds_from_midnight(t): # 拆分时、分、秒、微秒,统一换算成从当日0点开始计算的总秒数 return t.hour * 3600 + t.minute * 60 + t.second + t.microsecond / 1000000 # 替换原代码中直接做减法的逻辑 now_seconds = get_seconds_from_midnight(now) sunrise_seconds = get_seconds_from_midnight(sunrise) sunset_seconds = get_seconds_from_midnight(sunset) # 直接计算任意两个时间点的秒数差 diff_to_sunrise = now_seconds - sunrise_seconds diff_to_sunset = now_seconds - sunset_seconds因为你所有的时间值都取自当日(当日日出、当日日落、当日当前时间),不存在跨天的时间差场景,这个方法算出来的差值就是两个时间点的真实间隔秒数。
方案2:给纯时间对象绑定当日的日期部分,组成完整的
datetime对象做差
这种方式可以直接利用Python内置的timedelta类型获取时间差,不需要自己手动换算秒数:# 拿到今日的日期信息(不含时间部分) today_date = datetime.now().date() # 把纯时间和日期拼接成完整的datetime对象 now_full = datetime.combine(today_date, now) sunrise_full = datetime.combine(today_date, sunrise) sunset_full = datetime.combine(today_date, sunset) # 直接调用total_seconds()方法获取秒数差 diff_to_sunrise = (now_full - sunrise_full).total_seconds() diff_to_sunset = (now_full - sunset_full).total_seconds()
常见适配问题处理
从pandas读取Excel的日出、日落时间时,偶尔会遇到读出来的是字符串、或者pandas专属时间类型的情况,如果碰到这类问题,先把值转换为原生datetime.time对象再计算即可:
# 示例:如果读出来的sunrise是"06:12:34"格式的字符串,先转成time对象 sunrise = datetime.strptime(str(data["sr"][day-1]), "%H:%M:%S").time() sunset = datetime.strptime(str(data["ss"][day-1]), "%H:%M:%S").time()
内容的提问来源于stack exchange,提问作者instaspam
相关产品推荐
相关产品推荐

