Python datetime.timezone Class
- Syntax
-
Methods of Python
datetime.timezoneClass -
Example 1: Timezone-Aware
datetimeObjects -
Example 2: Timezone-Aware
timeObjects
The datetime module is a built-in module available in Python programming language. This library offers several classes to represent quantities related to date and time, such as date to represent a date, datetime to represent date and time combined, timedelta to represent a time difference, and timezone to describe a timezone.
The timezone class is a subclass of the tzinfo class, which is an abstract class and can only be inherited. To learn about the tzinfo class, refer to the official documentation here.
The tzinfo class fails at representing timezones of landmarks where different time offsets are used for different days of a year. Moreover, it cannot represent timezones of locations where historical changes have been made to civil time.
The timezone class implements 5 important methods and 1 attributes, which are as follows.
Syntax
datetime.timezone()
Parameters
| Type | Details | |
|---|---|---|
offset |
timedelta |
The UTC offset for the timezone is expressed as a timedelta object. |
name |
String | A name for the timezone. |
Returns
Since it is a class, it doesn’t return anything, but its constructor creates a timezone object.
Methods of Python datetime.timezone Class
The abstract class tzinfo contains five methods the inheriting class has to implement. Luckily, the timezone class implements them, and they are as follows.
timezone(offset, name=None)
The timezone is a constructor used to create class timezone instances. This method accepts two parameters.
offset: Time offset for a timezone. It should be of typetimedelta. To read more abouttimedelta, refer to the official documentation here.name: A string name for the timezone. By default, it is set toNone.
Note that the timedelta should be between -timedelta(hours = 24) and timedelta(hours = 24); otherwise, a ValueError is raised.
Since timezone is a subclass of the abstract class tzinfo, we can use its objects to create timezone-aware datetime objects. Refer to the following Python code.
import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours=5, minutes=30), name="Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours=2), name="CET")
tm3 = datetime.timezone(datetime.timedelta(hours=8), name="Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
Output:
Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
timezone.utcoffset(dt)
This method returns the timezone offset or the UTC offset of a timezone object. Note that the dt argument is mandatory and ignored internally.
So, we can pass a None value for it. This method returns a timedelta object whose value equals the difference between local time and UTC.
Refer to the following Python code for an example.
import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours=5, minutes=30), name="Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours=2), name="CET")
tm3 = datetime.timezone(datetime.timedelta(hours=8), name="Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("\nUTC Offsets\n")
print(tm1.utcoffset(None)) # here
print(tm2.utcoffset(None)) # here
print(tm3.utcoffset(None)) # here
Output:
Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
UTC Offsets
5:30:00
2:00:00
8:00:00
timezone.tzname(dt)
This method returns the name of the timezone set in the timezone object. If no value is assigned to the constructor, it is set to None.
For a None value, the name of the timezone is resolved by tzname(dt) using the offset. If the offset is timedelta(0), the name returned is "UTC".
For other cases, the following format is followed.
UTC±HH:MM
Where ± is the sign of the offset, and HH and MM are two digits of offset.hours and offset.minutes, respectively.
Refer to the following Python code for an example.
import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours=5, minutes=30), name="Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours=2), name="CET")
tm3 = datetime.timezone(datetime.timedelta(hours=8), name="Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("\nTimezone Names\n")
print(tm1.tzname(None))
print(tm2.tzname(None))
print(tm3.tzname(None))
Output:
Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
Timezone Names
Asia/Kolkata
CET
Asia/Singapore
timezone.dst(dt)
This method does not do anything; it always returns None. Refer to the following Python code for an example.
import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours=5, minutes=30), name="Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours=2), name="CET")
tm3 = datetime.timezone(datetime.timedelta(hours=8), name="Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("\nDST")
print(tm1.dst(None))
print(tm2.dst(None))
print(tm3.dst(None))
Output:
Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
DST
None
None
None
timezone.fromutc(dt)
This method returns dt + offset. Note that the dt must be of a datetime object, and its tzinfo should be set to self.
Refer to the following Python code for an example.
import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours=5, minutes=30), name="Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours=2), name="CET")
tm3 = datetime.timezone(datetime.timedelta(hours=8), name="Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("\nFrom UTC\n")
print(tm1.fromutc(dt1))
print(tm2.fromutc(dt2))
print(tm3.fromutc(dt3))
Output:
Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
From UTC
2022-08-25 19:41:33.234875+05:30
2022-08-25 12:41:33.234875+02:00
2022-08-26 00:41:33.234875+08:00
timezone.utc
This attribute stores the UTC or Coordinated Universal Time. More formally, it stores the value of timezone(timedelta(0)).
Refer to the following Python code for an example.
import datetime
print(datetime.timezone.utc)
Output:
UTC
Example 1: Timezone-Aware datetime Objects
import datetime
dt = datetime.datetime(2022, 9, 11, 12, 45, 59, 993842)
tm = datetime.timezone(datetime.timedelta(hours=5, minutes=30), name="IST")
dtAware = dt.astimezone(tm)
print("Naive DateTime Object:", dt)
print("Timezone-Aware DateTime Object:", dtAware)
Output:
Naive DateTime Object: 2022-09-11 12:45:59.993842
Timezone-Aware DateTime Object: 2022-09-11 18:15:59.993842+05:30
The Python code above first creates a naive datetime object. Next, with the help of the timezone class, it creates the IST timezone, which is UTC+05:30.
Next, using the astimezone() method available on a datetime object, it creates a new datetime object which is timezone-aware. Note that the date and time values are adjusted according to the timezone in the new object.
Since IST is 5 hours and 30 minutes ahead of UTC, the time is incremented by 5 hours and 30 minutes.
Example 2: Timezone-Aware time Objects
import datetime
tm = datetime.timezone(datetime.timedelta(hours=5, minutes=30), name="IST")
t = datetime.time(12, 45, 59, 993842, tm)
print("Timezone-Aware Time Object:", t)
Output:
Timezone-Aware DateTime Object: 12:45:59.993842+05:30
The Python code above first creates the IST timezone using the timezone class. Next, it creates a timezone-aware time object using the time class.
