如何在Ansible的Jinja模板中将数字月份转换为月份名称?
解决Ansible Jinja模板中数字月份转缩写名称的问题
你之前的模板语句报错是因为用错了to_datetime的格式符:%b是用来**解析月份缩写(比如Jan、Feb)**的,而你的输入是数字字符串"1",格式不匹配自然会抛出ValueError。
下面给两种可行的解决方法:
方法一:用日期格式化管道链
先把数字字符串转成整数,用%m格式解析成日期对象,再用strftime('%b')输出月份缩写:
m_usg_month: "{{ data.month | int | to_datetime('%m') | strftime('%b') }}"
- 步骤拆解:
data.month | int:把字符串"1"转成整数1to_datetime('%m'):用%m(数字月份格式)解析成日期对象strftime('%b'):把日期对象格式化为3字母的月份缩写
方法二:直接用列表映射
因为月份缩写是固定的,直接定义一个列表,通过数字索引取值(注意列表索引从0开始,所以要减1):
{% set month_abbrs = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] %} m_usg_month: "{{ month_abbrs[(data.month | int) - 1] }}"
这种方法不需要依赖日期处理,逻辑更直接,适合固定映射的场景。
测试你的输入:
data: month: "1"
两种方法都会输出:
m_usg_month: "Jan"
内容的提问来源于stack exchange,提问作者Vinny
相关产品推荐
相关产品推荐

