Ansible中转换ISO 8601时间为epoch报错,求解决方法
问题解决:Ansible中带时区微秒时间转Epoch时间
错误原因
你使用的strftime('%s')无法处理to_datetime返回的带时区(aware)的datetime对象,Python的datetime.strftime对%s格式符的支持依赖系统环境,且针对带时区的时间对象会抛出无效值错误。
可行解决方案
方案1:使用timestamp()方法(推荐)
Python 3.3+的datetime对象(包括带时区的)支持timestamp()方法,直接返回从Epoch开始的秒数(含微秒小数),如果需要整数秒可再转成int:
# 保留微秒的Epoch时间(浮点型) {{ ('2024-02-26T15:47:06.403633+00:00'| to_datetime(format='%Y-%m-%dT%H:%M:%S.%f%z')).timestamp() }} # 转成整数秒 {{ ('2024-02-26T15:47:06.403633+00:00'| to_datetime(format='%Y-%m-%dT%H:%M:%S.%f%z')).timestamp() | int }}
方案2:兼容旧版Python/Ansible
如果你的环境Python版本低于3.3,timestamp()不支持带时区的datetime对象,可以手动计算时间差:
{% set target_dt = '2024-02-26T15:47:06.403633+00:00'| to_datetime(format='%Y-%m-%dT%H:%M:%S.%f%z') %} {% set epoch_dt = target_dt.fromtimestamp(0, target_dt.tzinfo) %} {{ (target_dt - epoch_dt).total_seconds() | int }}
验证结果
执行上述代码后,会得到对应时间的Epoch值:1708962426(整数秒)或1708962426.403633(含微秒)。
内容的提问来源于stack exchange,提问作者Teacup
相关产品推荐
相关产品推荐

