Parse a time string: strptime
The strptime template function parses a date/time string according to a format you specify and returns a datetimeA value representing a specific moment in time, including the date, time, and time zone. For example, 2026-04-05 14:30:00+00:00. Used for timestamps, scheduling, and time-based calculations. object. Give it a string like “15/03/2024 14:30” along with the matching format “%d/%m/%Y %H:%M”, and it converts the text into a proper datetime you can work with.
While as_datetime handles ISO 8601 formatted strings automatically, many sensorsSensors return information about a thing, for instance the level of water in a tank. [Learn more] and external data sources provide dates in non-standard formats. A weather service might return “March 15, 2024”, a calendar integration might give you “15/03/2024”, or a custom sensor might report “2024.03.15 14:30”. strptime lets you parse any date format by telling it exactly how the string is structured. The format codes follow Python’s strftime/strptime conventions.
Usage
Here’s how to use this template function. Copy any example and adjust it to your setup.
{{ strptime("15/03/2024 14:30", "%d/%m/%Y %H:%M") }}
2024-03-15 14:30:00
Function signature
The signature is a technical summary of this template function. It shows the name of the function, the values (called parameters) it accepts, and what type of data each parameter expects (for example, a piece of text or a number).
Function parameters that have a = with a value after them are optional. If you leave them out, the default value shown is used automatically. Function parameters without a default are required.
strptime(
string: str,
format: str,
default: Any = None,
) -> datetime | Any
Function parameters
The following parameters can be provided to this function.
The format string describing the structure of the date/time string. Uses Python strftime format codes such as %Y (year), %m (month), %d (day), %H (hour), %M (minute), %S (second).
Common format codes
Here are the most frequently used format codes and what each one stands for:
-
%Y: four-digit year (for example,2024) -
%m: zero-padded month (for example,03) -
%d: zero-padded day (for example,15) -
%H: hour in 24-hour format (for example,14) -
%M: minute (for example,30) -
%S: second (for example,00) -
%B: full month name (for example,March) -
%A: full weekday name (for example,Friday) -
%I: hour in 12-hour format (for example,02) -
%p: AM or PM
Using a default value
If the string might not match the expected format, provide a default to avoid errors.
{{ strptime("invalid", "%Y-%m-%d", default="unknown") }}
unknown
Good to know
- The returned datetime has no time zone attached unless the format string includes one (for example, with
%z). Compare it to another naive datetime or add a time zone before comparing withnow. - Missing components default to their lowest value. A format that only parses a time gives you a datetime on
1900-01-01. - The format string must match the input exactly. Extra spaces, different separators, or a mismatched case for month names causes parsing to fail.
Try it yourself
Ready to test this? Open Developer tools > Template, paste the example into the Template editor, and watch the result update on the right. Edit the values to see how the function adapts to your own entitiesAn entity represents a sensor, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a device or a service. [Learn more].
More examples
Real scenarios where this function comes up in automations and templates. Copy any example and adapt it to your setup.
Parse a date with month name
Parse a date string that uses the full month name.
{{ strptime("March 15, 2024", "%B %d, %Y") }}
2024-03-15 00:00:00
Parse a 12-hour time format
Parse a time that uses AM/PM notation.
{{ strptime("2:30 PM", "%I:%M %p") }}
1900-01-01 14:30:00
Parse and compare with now
Parse a date string from a sensor and check if it is in the past.
{% set event_date = strptime(states("sensor.next_event"), "%Y-%m-%d %H:%M") %}
{{ event_date < now().replace(tzinfo=none) }}
false
Still stuck?
The Home Assistant community is quick to help: join Discord for real-time chat, post on the community forum with your template and expected result, or share on our subreddit /r/homeassistant.
AI assistants like ChatGPT or Claude can also explain or fix templates when you describe what you want in plain language.
Related template functions
These functions work well alongside this one:
-
Convert to datetime: as_datetime - Converts a string or timestamp to a datetime object.
-
Convert to UNIX timestamp: as_timestamp - Converts a datetime object or string to a UNIX timestamp.
-
Current local date and time: now - Returns the current date and time in your local time zone.
-
Format timestamp with custom format: timestamp_custom - Formats a UNIX timestamp as a string using a custom format.