Python Datetime with Timezones: Examples and Reference
Last updated:Table of Contents
- Current datetime in UTC
- Current datetime in Timezone
- Datetime with Offset Timezone
- Add UTC Timezone to naive datetime
- Convert datetime to another timezone
All examples use Python 3.6+ unless otherwise stated
Current datetime in UTC
To get the current timestamp in UTC timezone, use datetime.now()
passing timezone.utc
:
from datetime import datetime, timezone
dt = datetime.now(timezone.utc)
dt
# datetime.datetime(2021, 1, 3, 21, 14, 51, 547415, tzinfo=datetime.timezone.utc)
Current datetime in Timezone
Use datetime.now(timezone(timedelta(hours=<offset_hours>)))
from datetime import datetime, timezone, timedelta
dt = datetime.now(timezone(timedelta(hours=-3)))
dt
# datetime.datetime(2021, 1, 3, 18, 29, 54, 46852, tzinfo=datetime.timezone(datetime.timedelta(-1, 75600)))
Datetime with Offset Timezone
Timezones can be defined by the offset with respect to UTC.
from datetime import datetime, timezone, timedelta
# UTC+03:00
tz = timezone(timedelta(hours=3))
# May 10, 2016 at 12:30:00, on UTC-03:00
dt = datetime(2016,5,10,12,30,0,0, tzinfo=tz)
dt
# datetime.datetime(2016, 5, 10, 12, 30, tzinfo=datetime.timezone(datetime.timedelta(0, 10800)))
Add UTC Timezone to naive datetime
In other words, attach Timezone information to datetime
objects that were created without timezone information, without adjusting the time
from datetime import datetime, timezone
# this is a naive datetime without timezone information
naive_dt = datetime.now()
naive_dt
# datetime.datetime(2021, 1, 3, 18, 33, 50, 631654)
dt_with_tz = naive_dt.replace(tzinfo=timezone.utc)
dt_with_tz
# datetime.datetime(2021, 1, 3, 18, 33, 50, 631654, tzinfo=datetime.timezone.utc)
Convert datetime to another timezone
Use .astimezone(<other_time_zone>)
:
from datetime import datetime, timezone, timedelta
# 21:36 in UTC
base_dt = datetime.now(timezone.utc)
base_dt
# datetime.datetime(2021, 1, 3, 21, 36, 6, 339737, tzinfo=datetime.timezone.utc)
# becomes 23:36 in UTC+02:00
dt_in_utc_plus_2 = base_dt.astimezone(timezone(timedelta(hours=2)))
dt_in_utc_plus_2
# datetime.datetime(2021, 1, 3, 23, 36, 6, 339737, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))