# Formatting date in Ansible

**URL:** <https://forum.ansible.com/t/formatting-date-in-ansible/36119>\
**Category:** Ansible Project\
**Created:** [December 15, 2021, 8:36pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119 "2021-12-15T20:36:30Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![harry\_devine](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/harry_devine/32/5293_2.png) [@harry\_devine](https://forum.ansible.com/u/harry_devine)\
**Post date:** [December 15, 2021, 8:36pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/1 "2021-12-15T20:36:30Z")

</div>

In another thread, I was explaining how I’m getting a user’s information from our IPA server. I believe that the password expiration is already in a datetime format. I’d like to display it to the user via email in a more standard format.

For example, let’s say that the user’s password expiration date/value is 20210715141027Z. In the email I send out to them, I’d like to show 07/15/2021. Then, I’d like to calculate the date where their account will be automatically disabled, which should be 90 days after the expiration date. But I can’t figure out how to add 90 days to the expiration date.

Here’s part of my playbook for reference:

- name: Set Disabled Users fact  
set\_fact:  
disabled\_users: “{{ user\_show.results | json\_query(‘[\*].json.result.result.{uid: uid[0], mail: mail[0], nsaccountlock: nsaccountlock, pwdexp: krbpasswordexpiration[0]. **datetime** }’) | selectattr(‘pwdexp’,‘\<’,cutoff\_date) | selectattr(‘nsaccountlock’, ‘equalto’, False) | list }}”

- name: Print disabled users  
debug:  
msg: “{{ item.uid }} / {{ item.mail }} / {{ item.pwdexp.format(‘%m/%d/%Y’) }}”  
loop: “{{ disabled\_users }}”

Thanks,  
Harry

---

<div class="post-metadata">

**Author:** ![vbotka](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/vbotka/32/359_2.png) [@vbotka](https://forum.ansible.com/u/vbotka)\
**Post date:** [December 16, 2021, 12:24am UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/2 "2021-12-16T00:24:41Z")

</div>

For example

&nbsp;&nbsp;&nbsp;&nbsp;- debug:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var: \_date90  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\_date: "{{ pwdexp[0:4] }}-{{ pwdexp[4:6] }}-{{ pwdexp[6:8] }}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\_sec: "{{ (\_date|to\_datetime('%Y-%m-%d')).strftime('%s')|int  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ 90 \* 24 \* 60 \* 60 }}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\_date90: "{{ '%Y-%m-%d'|strftime(\_sec) }}"

gives

&nbsp;&nbsp;\_date90: '2021-10-13'

---

<div class="post-metadata">

**Author:** ![vbotka](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/vbotka/32/359_2.png) [@vbotka](https://forum.ansible.com/u/vbotka)\
**Post date:** [December 16, 2021, 12:37am UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/3 "2021-12-16T00:37:23Z")

</div>

This can be simplified

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\_sec: "{{ (pwdexp[0:8]|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to\_datetime('%Y%m%d')).strftime('%s')|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int + 90 \* 24 \* 60 \* 60 }}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\_date90: "{{ '%Y-%m-%d'|strftime(\_sec) }}"

---

<div class="post-metadata">

**Author:** ![harry\_devine](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/harry_devine/32/5293_2.png) [@harry\_devine](https://forum.ansible.com/u/harry_devine)\
**Post date:** [December 16, 2021, 1:48pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/4 "2021-12-16T13:48:02Z")

</div>

So I’m trying this:

- name: Print warning list users  
debug:  
msg: “{{ item.uid }} / {{ item.mail }} / {{ item.pwdexp }} / {{ (item.pwdexp[0:8]|to\_datetime(‘%Y%m%d’)).strftime(‘%s’)|int + 90 \* 24 \* 60 \* 60 }}”  
loop: “{{ warning\_users }}”

And I’m getting this:

TASK [Print warning list users] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
ok: [ipaserver.example.comt] =\> (item={u’pwdexp’: u’20210715141027Z’, u’mail’: u’test.user1@example.com’, u’uid’: u’test.user1’, u’nsaccountlock’: False}) =\> {  
“msg”: “test.user1 / [test.user1@example.com](mailto:test.user1@example.com) / 20210715141027Z / 1634097600”  
}

Any ideas?  
Harry

---

<div class="post-metadata">

**Author:** ![Antony\_Stone](https://avatars.discourse-cdn.com/v4/letter/a/4491bb/32.png) [@Antony\_Stone](https://forum.ansible.com/u/Antony_Stone)\
**Post date:** [December 16, 2021, 1:59pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/5 "2021-12-16T13:59:59Z")

</div>

So, you're starting from 15th July 2021 and adding 90 days, which comes to  
13th October.

strftime('%s') will give you the Unix Epoch time, in this case 1634097600,  
which is indeed the 13th October 2021.

Antony.

---

<div class="post-metadata">

**Author:** ![harry\_devine](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/harry_devine/32/5293_2.png) [@harry\_devine](https://forum.ansible.com/u/harry_devine)\
**Post date:** [December 16, 2021, 2:20pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/6 "2021-12-16T14:20:46Z")

</div>

I get that, but I want to show it as 10/13/2021. How do I do that???

Thanks,  
Harry

---

<div class="post-metadata">

**Author:** ![Antony\_Stone](https://avatars.discourse-cdn.com/v4/letter/a/4491bb/32.png) [@Antony\_Stone](https://forum.ansible.com/u/Antony_Stone)\
**Post date:** [December 16, 2021, 2:25pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/7 "2021-12-16T14:25:17Z")

</div>

I would try strftime('%m/%d/%Y') provided you are happy with dates in the first  
12 days of each month being highly ambiguous for an international audience.

Antony.

---

<div class="post-metadata">

**Author:** ![harry\_devine](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/harry_devine/32/5293_2.png) [@harry\_devine](https://forum.ansible.com/u/harry_devine)\
**Post date:** [December 16, 2021, 2:30pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/8 "2021-12-16T14:30:59Z")

</div>

So I just tried this:

- name: Print warning list users  
debug:  
msg: “{{ item.uid }} / {{ item.mail }} / {{ item.pwdexp }} / {{ (item.pwdexp[0:8]|to\_datetime(‘%Y%m%d’)).strftime(‘%m/%d/%Y’)|int + 90 \* 24 \* 60 \* 60 }}”  
loop: “{{ warning\_users }}”

And it gives me this:

“msg”: “test.user1 / [test.user1@example.com](mailto:test.user1@example.com) / 20210715141027Z / 7776000”

Thanks,  
Harry

---

<div class="post-metadata">

**Author:** ![Mike\_Eggleston](https://avatars.discourse-cdn.com/v4/letter/m/58956e/32.png) [@Mike\_Eggleston](https://forum.ansible.com/u/Mike_Eggleston)\
**Post date:** [December 16, 2021, 2:59pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/9 "2021-12-16T14:59:22Z")

</div>

I suggest you change the format to year, month then day. This format sorts naturally when you use ls(1).  
(The command in vi(1) is :!cp -p % %.211216 (or whatever is the current date).)

Mike

---

<div class="post-metadata">

**Author:** ![vbotka](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/vbotka/32/359_2.png) [@vbotka](https://forum.ansible.com/u/vbotka)\
**Post date:** [December 16, 2021, 3:33pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/10 "2021-12-16T15:33:49Z")

</div>

For example

- hosts: localhost  
&nbsp;&nbsp;vars:  
&nbsp;&nbsp;&nbsp;&nbsp;warning\_users:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- {uid: user1, mail: user1@example.com, pwdexp: 20210715141027Z}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- {uid: user2, mail: user2@example.com, pwdexp: 20210716141027Z}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- {uid: user3, mail: user3@example.com, pwdexp: 20210717141027Z}  
&nbsp;&nbsp;tasks:  
&nbsp;&nbsp;&nbsp;&nbsp;- debug:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg: "{{ item.uid }} /  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.mail }} /  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.pwdexp }} /  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ \_date90 }}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop: "{{ warning\_users }}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\_sec: "{{ (item.pwdexp[0:8]|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to\_datetime('%Y%m%d')).strftime('%s')|int  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ 90 \* 24 \* 60 \* 60 }}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\_date90: "{{ '%Y-%m-%d'|strftime(\_sec) }}"

gives

&nbsp;&nbsp;msg: user1 / user1@example.com / 20210715141027Z / 2021-10-13  
&nbsp;&nbsp;msg: user2 / user2@example.com / 20210716141027Z / 2021-10-14  
&nbsp;&nbsp;msg: user3 / user3@example.com / 20210717141027Z / 2021-10-15

---

<div class="post-metadata">

**Author:** ![Nico\_Kadel-Garcia](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/nico_kadel-garcia/32/9998_2.png) [@Nico\_Kadel-Garcia](https://forum.ansible.com/u/Nico_Kadel-Garcia)\
**Post date:** [December 16, 2021, 3:59pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/11 "2021-12-16T15:59:59Z")

</div>

YYYY-MM-DD is the very useful European standard, and is also followed  
by various useful RFC's, such as RFC 3339.Might I encourage ansible  
users to follow that standard as closely as possibl?

&nbsp;&nbsp;&nbsp;&nbsp;$ date --rfc-3339=seconds  
&nbsp;&nbsp;&nbsp;&nbsp;2021-12-16 10:58:09-05:00

It also preserves the offset from GMT, which the typical casually  
drummed up bit of python scripting will not.

---

<div class="post-metadata">

**Author:** ![harry\_devine](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/harry_devine/32/5293_2.png) [@harry\_devine](https://forum.ansible.com/u/harry_devine)\
**Post date:** [December 16, 2021, 4:05pm UTC](https://forum.ansible.com/t/formatting-date-in-ansible/36119/12 "2021-12-16T16:05:55Z")

</div>

Thanks Vladimir! That worked as I needed it to. I appreciate everyone’s input!

Thanks,  
Harry
