Ansible中如何将yyyymmdd时间戳转换为yyyy-mm-dd可读日期格式
需求说明
现有变量 "{{ outdated_certs.0.not_after[0:8] }}",输出值为yyyymmdd格式的纯数字日期,示例值为20220426,需要将其重格式化为yyyy-mm-dd的易读格式,对应示例目标输出为2022-04-26。
已验证的无效方案
- 调用
to_datetime过滤器,写法为" {{outdated_certs.0.not_after[0:8]| to_datetime }}",触发报错:
"time data '20220426' does not match format '%Y-%m-%d %H:%M:%S'"
- 调用
strftime过滤器,写法为"{{ '%Y-%m-%d' | strftime(outdated_certs.0.not_after[0:8]) }}",输出错误日期1970-08-22。经排查,该过滤器默认处理纪元时间(epoch time)格式的输入,不符合当前字符串日期转换需求。
可行方案
方案1:日期解析转换(推荐生产环境使用)
to_datetime过滤器支持手动指定原始日期的匹配格式,解析为标准时间对象后再格式化输出即可,写法如下:
{{ outdated_certs.0.not_after[0:8] | to_datetime('%Y%m%d') | strftime('%Y-%m-%d') }}
该方案会自动校验日期合法性,遇到无效日期值会直接抛出报错,不会生成异常拼接结果。
方案2:字符串切片拼接(适合数据源格式完全可信场景)
如果能保证原始值永远是严格8位的yyyymmdd格式,可直接通过字符串切片拼接得到目标格式,无需走日期解析逻辑,写法更简洁:
{{ outdated_certs.0.not_after[0:4] }}-{{ outdated_certs.0.not_after[4:6] }}-{{ outdated_certs.0.not_after[6:8] }}
注意:该方案不会校验日期合法性,若原始值存在非日期的异常内容,会直接输出拼接后的错误字符串。
内容的提问来源于stack exchange,提问作者d1530
相关产品推荐
相关产品推荐

