Convert date and time template

You don’t need a data template, just the value template. Since now() has a weekday() method, you can use that to directly map into a list of abbreviated localized weekday names:

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

We simply prepend the mapped localized day name to the custom timestamp here.

The weekday() method of a Python date or datetime object returns the day of the week as an integer, where Monday is 0 and Sunday is 6. Thus, it can be easily used as a list index for the days list (lists start with index 0).


Here’s a little challenge: Try to rewrite the above so it returns the abbreviated German weekdays plus a German month name, like Fr 31. Juli.

Hints:

  • Set up a list called months with the German month names.
  • now() also has an instance attribute called monthnow().month. It returns the month numbers 1–12.
  • Remember, list indexes start at zero.
  • The ~ operator in Jinja (the templating engine) concatenates strings, converting values to type string on the fly.

Have fun!


Edit: Strictly speaking, it is not necessary to update a date info every minute, as we do by specifying sensor.time as entity ID to watch.

So if you have sensor.date defined, use that instead. It will update only once per day, at midnight. This will save another few of the precious CPU cycles … :slight_smile:

2 Likes

Hey so i tried it and got this:

date2:
        friendly_name: "Datum mit Monat"
        value_template: >
          {% set months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] %}
          {{ now().strftime (' %d'), now().timestamp() | timestamp_custom(months[now().month] ~ ' %Y') }}

The problem is it gives me the wrong Month (1 Month ahead) and there are also brackets.
(‘22’,‘Dezember 2020’)
Do you know any Solutions?
I’m new to HomeAssistant and have no idea how to solve it.
Kind regards
Hannes

change to

          {% set months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] %}
          {{ now().strftime('%d') ~ ', ' ~ months[now().month-1] ~ now().timestamp() | timestamp_custom(' %Y') }}

or

          {% set months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] %}
          {{ (now().timestamp() | timestamp_custom('%d, # %Y')).replace('#', months[now().month-1]) }}
1 Like

Ah ok thank you.

You Sir are THE timestamp template guru!! With the above info I was able to template my lock log sensors’ dates and times!

1 Like

Hi all,

i search for a Solution:

here my output:
sensor.fritzbox_connection_uptime => 2021-07-24T00:34:26+00:00

But I want to show the time: 1 Week, 2 Days, 3 Hours, 2 Second…

Thanks all

@basti4k
What have u tried and wich are the results? I gues you studied this tread?

i try this:

net_uptime:
      value_template: "{{ as_timestamp(strptime( states('sensor.fritzbox_connection_uptime'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom('%Y-%m-%d %H:%M:%S') }}"
      unit_of_measurement: "Tage"
      friendly_name: "Verbunden"
      icon_template: mdi:calendar

For a other Day-Format. But now i search a “Counter”

here my solution:

net_uptime_pretty:
      friendly_name: Verbunden
      value_template: >
        {%- set up_time = as_timestamp(now())-as_timestamp(states('sensor.fritzbox_connection_uptime')) %}

        {% if states('sensor.last_boot') == '0.0' %}
          Soeben neu gestartet...
        {% else %}

        {%- macro phrase(name, divisor, mod=None) %}
          {%- set value = ((up_time // divisor) % (mod if mod else divisor)) | int %}
          {{- '{} {}'.format(value, name) if value | int > 0 else '' }}
        {%- endmacro %}

        {%- set values = [
          phrase('W.', 60*60*24*7),
          phrase('T.', 60*60*24, 7),
          phrase('Std.', 60*60, 24),
          phrase('Min.', 60),
          phrase('Sek.', 1, 60)
        ] | select('!=','') | list %}

        {{ values[:-1] | join(', ') ~ ' ' ~ values[-1] if values | length > 1 else values | first }}
        {% endif %}
1 Like

i tested the code that you posted, the list says when i use for example %A for the weekday he takes my selected language in HA, but he always make the weekday english, my language is german.

Please read the full thread. It has a solution to your problem.

okay, but i had problems to undestand how to add this to my code, perhaps you can give me a hint?

{{as_timestamp(strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom("%A %d.%b %-H:%M")}}

Sir, it’s literally posted above. Please read the thread. That requires you to read my post, then read the responses IN THIS THREAD.

Here’s a hint, this post has the code:

Yeah sir,

i understand it but i use it different i dont want to use the now().timestamp() function.

what i understand is

{{as_timestamp(strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom("%w")}}

this gives me the day as number, i think this is needed for the days variable. (its one day to much but i think i can adjust it with -1 because he counts from 0)

{% set days = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'] %}
{{ as_timestamp(strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom(days[now().weekday()-1] ~ ' %d.%b %-H:%M') }}

now i must replace the now().weekday()-1 with my value from the entity.
i tried it with this

{% set days = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'] %}
{{ as_timestamp(strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom(days[as_timestamp(strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom("%w")] ~ ' %d.%b %-H:%M') }}

but this gives me a error.

UndefinedError: 'list object' has no attribute '6'

strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom("%w") | int

1 Like

thank you, that was the hint that helps me, here is the code

{{ as_timestamp(strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom(days[as_timestamp(strptime(state_attr('calendar.famillien_termine', 'start_time'), '%Y-%m-%d %H:%M:%S')) | timestamp_custom("%w") | int -1] ~ ' %d.%b %-H:%M') }}

Oh oh, if you get “Sir’ed” by Petro, you should try a lot harder… :rofl: :rofl: :rofl:

EDIT: sorry, couldn’t resist :rofl:

2 Likes

I tried my best knowledge, I don’t want to let anyone do the work for me here, or annoy me. but I needed the missing hint, what I just don’t know I can’t conjure up. that’s how you learn. I think that’s what the forum is for. nevertheless thank you very much

Hello,
I tried to get rid of unnecessary date/time information of one of my sensors.
This sensor


creates a timestamp and I want to customize this time/date in only hour:minute day-month.

To achieve this I created the following sensor:

buro_time_temp_change:
        unique_id: buro_time_temp_change
        friendly_name: "Büro Time Temp change"
        value_template: "{{ as_timestamp(states(sensor.buro_next_scheduled_change_time)) | timestamp_custom('%h:%m') }}"
        device_class: timestamp

Although I found several varieties of this “value_template…” but after a positive configuration check the new sensor is always unavailable.

Can somebody please help me out?

Wrap the sensor’s entity_id in quotes (without the quotes it’s handled as the name of an undefined variable) and remove device_class: timestamp (a timestamp sensor’s value must contain the date and time and this template is only providing the time).

buro_time_temp_change:
  unique_id: buro_time_temp_change
  friendly_name: "Büro Time Temp change"
  value_template: "{{ as_timestamp(states('sensor.buro_next_scheduled_change_time')) | timestamp_custom('%h:%m') }}"