Convert date and time template

I have a sensor setup for the next start time of an event in google calender. I am wanting to try and convert it into something more readable with a template sensor.

Currently the start time is an attribute of the calender sensor

{{ state_attr('calendar.chris_work_calendar', 'start_time') }}

that returns…

2019-02-15 08:00:00

I am wanting it to read something like … Friday @ 8:00am

I am thinking it should be something like …

{{ strptime(state_attr('calendar.chris_work_calendar', 'start_time'), '%Y-%m-%d %H:%M:%S').hour }}

Which gives me the hour number. “8”

Now how do I get it to output “The day of the week” then “12-hour clock time using the AM/PM notation”?

any clues?

3 Likes
{{ as_timestamp(strptime(state_attr('calendar.chris_work_calendar', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom("%A @ %-I:%M %p") }}

Here is a list of the attributes for custom timestamps

Directive Meaning Example
%a Weekday as locale’s abbreviated name. Sun, Mon, …, Sat (en_US);So, Mo, …, Sa (de_DE)
%A Weekday as locale’s full name. Sunday, Monday, …, Saturday (en_US);Sonntag, Montag, …, Samstag (de_DE)
%w Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. 0, 1, …, 6
%d Day of the month as a zero-padded decimal number. 01, 02, …, 31
%b Month as locale’s abbreviated name. Jan, Feb, …, Dec (en_US);Jan, Feb, …, Dez (de_DE)
%B Month as locale’s full name. January, February, …, December (en_US);Januar, Februar, …, Dezember (de_DE)
%m Month as a zero-padded decimal number. 01, 02, …, 12
%y Year without century as a zero-padded decimal number. 00, 01, …, 99
%Y Year with century as a decimal number. 1970, 1988, 2001, 2013
%H Hour (24-hour clock) as a zero-padded decimal number. 00, 01, …, 23
%I Hour (12-hour clock) as a zero-padded decimal number. 01, 02, …, 12
%p Locale’s equivalent of either AM or PM. AM, PM (en_US);am, pm (de_DE)
%M Minute as a zero-padded decimal number. 00, 01, …, 59
%S Second as a zero-padded decimal number. 00, 01, …, 59
%f Microsecond as a decimal number, zero-padded on the left. 000000, 000001, …, 999999
%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive). (empty), +0000, -0400, +1030
%Z Time zone name (empty string if the object is naive). (empty), UTC, EST, CST
%j Day of the year as a zero-padded decimal number. 001, 002, …, 366
%U Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. 00, 01, …, 53
%W Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. 00, 01, …, 53
%c Locale’s appropriate date and time representation. Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE)
%x Locale’s appropriate date representation. 08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE)
%X Locale’s appropriate time representation. 21:30:00 (en_US);21:30:00 (de_DE)
%% A literal '%' character. %
32 Likes

Ah the timestamp_custom was the bit I couldn’t figure out. Love this community. Your a start thank you!

I just had to change the " to ’ when I moved it from the template tester to the configuration.yaml

sensor:
  - platform: template
    sensors:
      chris_next_working_start:
          friendly_name: "Chris Next Working Start"
          value_template: "{{ as_timestamp(strptime(state_attr('calendar.chris_work_calendar', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom('%A @ %-I:%M %p') }}"
1 Like

Hello

I can’t figure out how to transform this:
value: (1d 3h 59m) has this value: (H: M)
could you help me

sorry for my english i use a translator.

You have H:M?
You want 1d 3h 59m?

or

You have 1d 3h 59m?
You want H:M?

I have 1d 3h 59m?
I want H:M?

{% set myitem = states('replace.me') %}
{{ as_timestamp(strptime(myitem, '%dd %Hh %Mm')) | timestamp_custom('%H:%M') }}
1 Like

thank you

{% set myitem = states(‘replace.me’) %}
{{ as_timestamp(strptime(states.sensor.heure_travailler_par_mois_a.attributes.value, ‘%dd %Hh %Mm’)) | timestamp_custom(’%H:%M’) }} i have that 12:51

{{states.sensor.heure_travailler_par_mois_a.attributes.value}} i have that 1d 12h 52m

can we convert days to hours?

Thanks @petro this is useful!

I’m currently trying to find a way to convert a Life360 timestamp in UTC to something more readable. e.g

From: 2020-02-09T12:54:21+00:00

To: Sunday @ 12:54pm

First question, can the time be obtained from an an entity’s attribute? In this case, the entity is called device_tracker.life360_name with an attribute called at_loc_since.

I’ve tried this within the template editor but it gives an error:

{{ as_timestamp(strptime(state_attr('device_tracker.life360_name', 'at_loc_since'), '%Y-%m-%dT%H:%M:%S+00:00')) | timestamp_custom('%A @ %-I:%M %p') }}

I’ll keep hunting for answers in the meantime.

TIA!

yours is easier than you are making it

{{ as_timestamp(state_attr('device_tracker.life360_name', 'at_loc_since')) | timestamp_custom('%A @ %-I:%M %p') }}
2 Likes

Cool, found this thread: The EPIC Time Conversion and Manipulation Thread!

By breaking it down in the template editor, I was able to figure out the following:

{%- set good_time_string_UTC = '2018-12-11T12:24:32.00-00:00' %}

Time {{ good_time_string_UTC }}
timestamp = {{ as_timestamp(good_time_string_UTC) }}

timestamp2 = {{ state_attr('device_tracker.life360_name', 'at_loc_since') }}

{{ as_timestamp(state_attr('device_tracker.life360_name', 'at_loc_since')) | timestamp_custom('%A @ %-I:%M %p') }}

Template editor result showed as:

Time 2018-12-11T12:24:32.00-00:00
timestamp = 1544531072.0

timestamp2 = 2020-02-09 14:48:06+00:00

Sunday @ 2:48 PM

Works well like this!

sensor:
  - platform: template
    sensors:
      life360_name_lastseen:
        friendly_name: "Name Last Seen"
        value_template: "{{ as_timestamp(state_attr('device_tracker.life360_name', 'at_loc_since')) | timestamp_custom('%A @ %-I:%M %p') }}"
1 Like

Thanks for your help and reply Petro, it’s good to know I was on the right track. :slight_smile:

2 Likes

So, is it possible to do the same thing in javascript by any chance?

Ideally I’d like to convert UTC to a similar output within custom fields in the button card (I came across this post whilst hunting for solutions). Whilst this jinja2 method works well, it would mean creating two sensors for each person (last seen and at loc since), so a neater solution is to convert within javascript.

Happy to bring this up in the button card thread instead rather than hijacking this one (I’ve seen you active in there too).

Thanks.

I have a sensor which reports rain at e.g. 16:25 (HH:MM). I want to compare this with equal or less than states(‘sensor.time’) + 20 minutes, before retracting my sunblinds. I take it that in order to accomplish this, I first have to make a unix timestamp of both and here is where I get stuck. Any suggestions?

Ignore my request. I was too quick. On this excellent forum and thanks to petro, I found the solution: How to trigger automation BEFORE set time?

How can I change the Sun, Mon, …, Sat to German spelling?

Do I need to add “(de_DE)” somewhere in the code next to “%a”?

value_template: >
          {{ as_timestamp(now()) | timestamp_custom('%a %d.%m') }}

Or do I need to add “(de_DE)” in generall settings?

You can’t change the ‘under the hood language’. You’ll have to create a map that links the english to German.

And how can I create a translation map?

I tried with

{% set days = ["Mo ", "Di ", "Mi ", "Do ", "Fr ", "Sa ", "So "]  %}

Full Code:

  - platform: template
    sensors:
      date2:
        friendly_name: "Datum"
        entity_id: sensor.time
        value_template: >
          {{ as_timestamp(now()) | timestamp_custom('%a %d.%m') }}
          {% set days = ["Mo ", "Di ", "Mi ", "Do ", "Fr ", "Sa ", "So "]  %}
        icon_template: mdi:calendar-range

Or do you mean to use the replace function? Like for example:

replace("Thu", "Do")

see this post

The config check says: data_template is an invalid option for sensor.template

Do I need to create a service dir this? If so, what service?

  - platform: template
    sensors:
      date2:
        friendly_name: "Datum"
        entity_id: sensor.time
        value_template: >
          {{ as_timestamp(now()) | timestamp_custom('%a %d.%m') }}
        data_template:
          entity_id: sensor.time
          message: >
            {% set days = ["Mo ", "Di ", "Mi ", "Do ", "Fr ", "Sa ", "So "] %}
        icon_template: mdi:calendar-range