为何strptime仅支持减法不支持加法?HomeAssistant Jinja2技术问询
问题解答:为何HomeAssistant Jinja2模板中strptime仅支持减法不支持加法?
这个问题我之前折腾过好一会儿,其实核心原因很简单:strptime()返回的是datetime.datetime对象,而Python的datetime类型规则里,两个datetime对象只能做减法,不能直接做加法!
先看你的减法为什么能跑通
你这段减法代码:
{{ strptime(states('input_datetime.music_alarm'), "%H:%M:%S") - strptime("10", "%M") }}
这里两个strptime()都返回了datetime对象(第二个strptime("10", "%M")会默认把日期补成1900-01-01 00:10:00),Python允许两个datetime相减,结果是一个timedelta对象(表示时间差),所以模板能正常渲染。
加法报错的本质
而当你尝试做加法时,datetime + datetime是Python完全不支持的操作——你总不能把两个“日期时间”直接加在一起吧?这逻辑上也说不通。你看到的报错TypeError: bad operand type for unary -: 'datetime.datetime'虽然看起来有点误导,但本质就是加法操作违反了datetime类型的运算规则。
正确的加法实现方式
要给一个时间加上N分钟/小时,你需要用timedelta对象(表示一段时长)来和datetime对象做加法。在HomeAssistant的Jinja2模板里,直接用timedelta()函数就能创建时长对象:
{{ strptime(states('input_datetime.music_alarm'), "%H:%M:%S") + timedelta(minutes=10) }}
如果要让代码更清晰,也可以先把闹钟时间存成变量再操作:
{% set alarm_datetime = strptime(states('input_datetime.music_alarm'), "%H:%M:%S") %} {{ alarm_datetime + timedelta(minutes=10) }}
这样就能正常得到延后10分钟的时间啦!
内容的提问来源于stack exchange,提问作者Himmators
相关产品推荐
相关产品推荐

