In this article, we’ll explore how to use date and time in Python. We’ll see real-life examples of working with date and time using the Python datetime
and time
modules.
Working with times and dates is inevitable when building real-life projects, and there are many use cases for them. Thankfully, Python has a couple of modules that make it easy to work with dates and times across different timezones.
The code for this tutorial can be found on GitHub.
Contents:
- The time Module
- The datetime Module
- Getting the Current Date and Time in Python
- Getting the Current Date in Python
- The datetime Module Classes
- The date Class
- The time Class
- The datetime Class
- The timedelta Class
- Python datetime Formatting
- Working with timedelta
The time Module
Table of Contents
- 1 The time Module
- 2 The datetime Module
- 3 Getting the Current Date and Time in Python
- 4 Getting the Current Date in Python
- 5 The datetime Module Classes
- 6 The date Class
- 7 The time Class
- 8 The datetime Class
- 9 The timedelta Class
- 10 Python datetime Formatting
- 11 Working with timedelta
- 12 Working with Timezones
- 13 Conclusion
The Python time
module is for performing time-related operations. We’ll now highlight some of the most commonly used functions in the time
module, with examples.
The time() function
The time()
function returns the current time in seconds since the beginning of a set epoch as a floating point number. The epoch that’s used starts in January 1, 1970, 00:00:00 (UTC):
import time as time_module time_in_seconds = time_module.time()
print("Time in sceconds from epoch", time_in_seconds)
Here’s the output of the code above:
Time in sceconds from epoch 1680712853.0801558
The gmtime() function
The gmtime()
function returns a struct_time
in UTC from time expressed in seconds since the beginning of the epoch. A struct_time
is a type of time value sequence with a named tuple interface returned by gmtime()
, localtime()
, and strptime()
:
import time as time_module utc_time_in_seconds = time_module.gmtime()
print("Time struct in UTC", utc_time_in_seconds)
Here’s the output of the code above:
Time struct in UTC: time.struct_time(tm_year=2023, tm_mon=3, tm_mday=16, tm_hour=14, tm_min=47, tm_sec=28, tm_wday=3, tm_yday=75, tm_isdst=0)
The localtime() function
The localtime()
function returns a struct_time
in local time from time expressed in seconds since the beginning of the epoch:
import time as time_module local_time = time_module.localtime()
print("Time struct in local time:", local_time)
Here’s the output of the code above:
Time struct in local time: time.struct_time(tm_year=2023, tm_mon=4, tm_mday=20, tm_hour=15, tm_min=46, tm_sec=15, tm_wday=3, tm_yday=75, tm_isdst=0)
The ctime() function
The ctime()
method converts time in seconds from the beginning of the epoch to a string format. If no arguments are passed to the function, it returns a time string for the current time in seconds:
import time as time_module time_in_secs = 1678671984.939945 time_string = time_module.ctime(time_in_secs)
print("Time string: ",time_string)
Here’s the output of the code above:
Time string: Thu Apr 20 01:46:24 2023
The strftime() function
The strftime()
method converts a struct_time
to a time string as specified by a given format argument:
import time as time_module time_tuple = time_module.gmtime()
time_format = "%y/%m/%d %I:%M:%S %p" time_in_string = time_module.strftime(time_format, time_tuple) print("Time expressed as formatted string:", time_in_string)
Here’s the output of the code above:
Time expressed as formatted string: 23/04/20 04:40:04 PM
The sleep() function
The sleep()
function delays the execution of a thread for a specified number of seconds:
import time as time_module for i in range(5): local_time = time_module.localtime() seconds = local_time.tm_sec print(seconds) time_module.sleep(2)
Here’s the output of the code above:
49
51
53
55
57
In the code above, the number 2
is passed in as an argument of the sleep()
function, which causes the loop to delay two seconds before execution. The numbers that are output validate our code.
The datetime Module
The datetime module supplies classes for manipulating dates and times.
These classes are essential for easy manipulation, extraction, and output formatting of time intervals, times and dates. Ordinarily, date and time are not considered data types in Python, but they are date and time objects of the datetime
module classes. Datetime
classes also have different methods available for handling date and time objects.
Getting the Current Date and Time in Python
To get the current date and time, import the datetime
class from the datetime
module. The datetime
class has a method, now()
, which returns the current date and time:
from datetime import datetime current_date_time = datetime.now()
print(current_date_time)
Here’s the output of the code above:
2023-04-20 13:47:02.362424
Getting the Current Date in Python
To get the current date, import the date
class from the datetime
module. The date
class has a method, today()
, which returns the current date:
from datetime import date current_date = date.today()
print(current_date)
Here’s the output of the code above:
2023-04-20
The datetime Module Classes
The datetime
module currently has six classes, each with different methods for manipulating date and time objects. The classes are listed as follows:
date
time
datetime
timedelta
tzinfo
timezone
The date Class
A date object represents a date (year, month and day) in an idealized calendar — the current Gregorian calendar indefinitely extended in both directions.
A date object can be instantiated as follows:
datetime.date(year, month, day)
The date object constructor takes three integer arguments and should be within the specified range:
MINYEAR
<= year <=MAXYEAR
- 1 <= month <= 12
- 1 <= day <= number of days in the given month and year
In the code above, MINYEAR
is 1
and MAXYEAR
is 9999
. The values represent the smallest and biggest year number allowed in a date or datetime object.
When the arguments are out of range, it throws a ValueError
, and non-integer arguments throw a TypeError
.
Example: Create a date object
To create a date object, import the date
class from the datetime
module, and pass arguments for year, month and day into the date constructor. The arguments must be integers and within the specified range:
from datetime import date mydate = date(2023, 4, 20)
print('The date is: ', mydate)
Here’s the output of the code above:
The date is: 2023-04-20
Example: Get the current date
To get the current local date, use the date class today()
and ctime()
methods:
from datetime import date current_date = date.today()
print(current_date.ctime())
The today()
method will return a local date, while the ctime()
method renders the date as a string.
Here’s the output of the code above:
Thu Apr 20 00:00:00 2023
Example: Create the date from ISO format
A date object can be created from a date string in ISO 8601 format. Use the fromisoformat()
method of the date class to do this:
from datetime import date iso_date = date.fromisoformat('2023-04-20')
print("Date from ISO format: ", iso_date)
Note: ISO 8601 is a standardized format for presenting dates and time without creating confusion across different regions or timezones. ISO 8601 takes the format YYYY-MM-DD
.
Here’s the output of the code above:
Date from ISO format: 2023-04-20
Example: Create date object from string
To create a date object, pass a date string and corresponding format to the strptime()
method. Extract the date by using the date()
method of the returned datetime object:
from datetime import datetime datetime_object = datetime.strptime("20/04/23", "%d/%m/%y")
date_object = datetime_object.date() print("Date from string:", date_object)
Here’s the output of the code above:
Date from string: 2023-04-20
Example: Get the year, month, day from the date object
To extract the year, month and day from a date object, use the .year
, .month
, and .day
attributes of the date class:
from datetime import date current_date = date.today() year = current_date.year
print("The year is: ", year) month = current_date.month
print("The month is: ", month) day = current_date.day
print("The day is: ", day)
Here’s the output of the code above:
The year is: 2023
The month is: 4
The day is: 20
The time Class
A time object represents a (local) time of day, independent of any particular day, and subject to adjustment via a tzinfo object.
A date object can be instantiated as follows:
datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
The time object can be instantiated without any arguments. All arguments are optional with a default value of 0
, except tzinfo
, which is None
. All arguments must be integers within a specified range, while the tzinfo
argument should be an instance of the tzinfo
subclass:
- 0 <= hour < 24,
- 0 <= minute < 60,
- 0 <= second < 60,
- 0 <= microsecond < 1000000.
When arguments that are out of range are passed to the constructor, it raises a ValueError
.
Example: Create a time object
To create a time object, import the time
class from the datetime
module. Pass arguments for hours, minutes, seconds, microseconds and tzinfo
. Remember that all arguments are optional, so when no argument is passed to the constructor, the time object returns 00:00:00
:
from datetime import time my_time = time(20, 30, 12)
print("My time is: ", my_time)
Here’s the output of the code above:
My time is: 20:30:12
Example: Create time from ISO format
A time object can be created from a time string in ISO 8601 format. Use the fromisoformat()
method of the time class to do this:
from datetime import time iso_time = time.fromisoformat('12:45:12')
print('The time says: ', iso_time)
Here’s the output of the code above:
The time says: 12:45:12
Example: Create time object from string
To create a time object, pass a date
string and corresponding format to the strptime()
method. Extract the time by using the time()
method of the returned datetime object:
from datetime import datetime datetime_object = datetime.strptime("20 Apr, 2023 13:50:30", "%d %b, %Y %H:%M:%S")
time_object = datetime_object.time() print("Time from string:", time_object)
Here’s the output of the code above:
Time from string: 13:50:30
Example: Get hours, minutes, seconds and microseconds from the time object
To extract values for hours, minutes, seconds and microseconds, use the hour
, minute
, second
, and microsecond
attributes of the time object:
from datetime import time new_time = time(7, 20, 50, 569230) hour = new_time.hour
print('Hours: ',hour) minute = new_time.minute
print('Minutes: ', minute) second = new_time.second
print('Seconds: ', second) microsecond = new_time.microsecond
print('Microseconds: ', microsecond)
Here’s the output of the code above:
Hours: 7
Minutes: 20
Seconds: 50
Microseconds: 569230
The datetime Class
A datetime object is a single object containing all the information from a date object and a time object.
A datetime object can be instantiated as follows:
datetime.datetime(year, month, day, hour, minute=0, second=0, microsecond=0, tzinfo=None)
The datetime
constructor requires the year, month and day arguments. The tzinfo
default is None
or an instance of the tzinfo
subclass. The time arguments are optional, but the arguments must be integers and within range:
- MINYEAR <= year <= MAXYEAR,
- 1 <= month <= 12,
- 1 <= day <= number of days in the given month and year,
- 0 <= hour < 24,
- 0 <= minute < 60,
- 0 <= second < 60,
- 0 <= microsecond < 1000000.
A ValueError
is raised if arguments are out of range.
Example: Create a datetime object
To create a datetime object, import the datetime
class from the datetime
module and pass the following arguments:
from datetime import datetime dt = datetime(2023, 4, 20, 10, 38, 10, 345389)
Here’s the output of the code above:
The date time is: 2023-04-20 10:38:10.345389
Example: Get the current local date and time
To get the current local date and time, use the now()
method of the datetime
class:
from datetime import datetime print('Current locate date time is: ', datetime.now())
Here’s the output of the code above:
Current locate date time is: 2023-04-20 10:50:08.944232
Example: Create date time from ISO format
To create a datetime object from a date time string in ISO 8601 format, use the fromisoformat()
method of the datetime
class:
from datetime import datetime iso_dt = datetime.fromisoformat('2023-04-20 11:25:30.983023')
print('Date time from ISO is: ', iso_dt)
Note: if the date string argument passed into the fromisoformat()
method isn’t a valid ISO format string, a ValueError
exception is raised. The date output here is quite similar to the result obtain from datetime.now()
.
Here’s the output of the code above:
Date time from ISO is: 2023-04-20 11:25:30.983023
Example: Get date and time attributes from the datetime object
A datetime object offers the following attributes: year
, month
, day
, hour
, minute
, second
, microsecond
, tzinfo
and fold
. The attributes can be accessed as follows:
from datetime import datetime new_dt = datetime.now() year = new_dt.year
print('Year: ', year) month = new_dt.month
print('Month: ', month) day = new_dt.day
print('Day: ', day) hour = new_dt.hour
print('Hours: ', hour) minute = new_dt.minute
print('Minutes: ', minute) second = new_dt.second
print('Seconds: ', second) microsecond = new_dt.microsecond
print('Microseconds: ', microsecond) tz_info = new_dt.tzinfo
print('Timezone info: ', tz_info) fold = new_dt.fold
print('Fold: ', fold)
Here’s the output of the code above:
Year: 2023
Month: 4
Day: 20
Hours: 12
Minutes: 42
Seconds: 15
Microseconds: 794955
Timezone info: None
Fold: O
Note: the default attribute value for tzinfo
is None
, because there’s no object argument passed, and fold
will return 0
by default. For more on the fold
attribute (which was introduced in Python version 3.6), see the docs.
The timedelta Class
A timedelta object represents a duration, the difference between two dates or times.
A timedelta object can be instantiated as follows:
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
All arguments are optional, with a default value of 0. Integers or floats, positive or negative numbers are valid arguments for the constructor.
Arguments are converted as follows:
- A millisecond is converted to 1000 microseconds.
- A minute is converted to 60 seconds.
- An hour is converted to 3600 seconds.
- A week is converted to 7 days.
All arguments should fall within the following range as specified in the docs:
0
<= microseconds <1000000
0
<= seconds <3600*24
(the number of seconds in one day)-999999999
<= days <=999999999
An OverFlowError
is raised if arguments are outside the normalized days range.
Example: Create a timedelta object
To create a timedelta object, import the timedelta
class from the datetime
module. Pass the appropriate arguments to the constructor function:
from datetime import timedelta td = timedelta(10, 30, 4300, 3000, 12, 5, 3)
print('Time Delta: ', td)
Here’s the output of the code above:
Time Delta: 31 days, 5:12:33.004300
Python datetime Formatting
Date and time formats differ from region to region and country to country. It’s because of these differences in date and time formats that the ISO 8601 format was introduced, as a way to standardize date and time.
However, there may be a need to format date and time in a particular way based on a country or region.
Formatting datetime with the strftime() method
Datetime formatting can be done with the strftime()
method. The strftime()
method is an instance method of time
, date
and datetime
classes, which means we have to create a date, time or datetime object to apply the method. The method takes a given format code as an argument, and returns a string representing time
, date
or datetime
from in the desired format.
The method signature looks like this:
strftime(format)
Usually a string format code is passed as an argument to strftime()
method to format date. Some of the format codes are as follows:
%a
: weekday abbreviated name — such as Sun, Mon, etc.%b
: month as abbreviated name — such as Jan, Feb, etc.%y
: year without century as a zero-padded decimal number — such as 00, 01, 02, etc.
A more detailed table with format code can be found in the Python docs.
Example: Format date and time in a datetime object
Just like in the previous examples, we can pass an argument of the format string of the desired date and time output to the strftime()
method:
from datetime import datetime date_time = datetime.now() formatted_date_time = date_time.strftime("%d %B %Y, %H:%M:%S")
print("Formatted date and time:", formatted_date_time) formatted_date_time_2 = date_time.strftime("%A, %d %B %Y, %I:%M %p")
print("Formatted date and time in 12-hour clock:", formatted_date_time_2)
Here’s the output of the code above:
Formatted date and time: 20 April 2023, 11:11:40
Formatted date and time in 12-hour clock: Thursday, 20 April 2023, 11:11 AM
Formatting datetime with the strptime() method
Unlike strftime()
, the strptime()
is a datetime
class method, which means it can be used without creating an object of the class. The method returns a datetime object from a given date string and format.
The method signature looks like this:
strptime(date_string, format)
A string format code is passed as an argument to strptime()
method to format date.
Example: String to datetime object
To create a datetime object, we’ll pass two arguments to the strptime()
method, a date string and a corresponding format. A ValueError
is raised when the date string doesn’t match the provided format:
from datetime import datetime date_string = "April 20, 23 12:12:20"
dt_format = "%B %d, %y %H:%M:%S" datetime_from_string = datetime.strptime(date_string, dt_format)
print("Datetime from string:", datetime_from_string)
Here’s the output of the code above:
Datetime from string: 2023-04-20 12:12:20
Working with timedelta
The timedelta
class in Python is used for calculating the difference between dates, calculating time differences between specific dates, and also performing other calculations using specific units of time (such as weeks or hours).
Example: Calculate a future date
from datetime import datetime, timedelta date_now = datetime.now()
print("Today's date:", date_now) future_date = date_now + timedelta(days=7)
print("Future date is:", future_date)
Here’s the output of the code above:
Today's date: 2023-04-20 15:50:43.415319
Future date is: 2023-04-27 15:50:43.415319
From the example above, we first get a current local date and time and a timedelta object of seven days. Because timedelta
supports operations like addition, we add the datetime object and timedelta object to get a future day in seven days. If our current date is 2023-04-20
, in seven days the date will be 2023-04-27
.
Example: Calculate the difference between two timedelta objects
from datetime import timedelta time_delta1 = timedelta(days=23, hours=0, minutes=20)
time_delta2 = timedelta(days=15, seconds=2, microseconds=123, milliseconds=234566, minutes=5, hours=2) result = time_delta1 - time_delta2 print("Difference between two timedelta objects:", result)
Here’s the output of the code above:
Difference between two timedelta objects: 7 days, 22:11:03.433877
In the code snippet above, we’ve created two timedelta objects, time_delta1
and time_delta2
, and calculated the difference between them.
Example: Calculate the sum of two timedelta objects
from datetime import timedelta time_delta1 = timedelta(days = 2, hours = 1, seconds = 33, weeks=2)
time_delta2 = timedelta(days = 4, hours = 11, minutes = 4, seconds = 54) result = time_delta1 + time_delta2 print("Sum of two delta objects:", result)
Here’s the output of the code above:
Sum of two delta objects: 20 days, 12:05:27
As seen above, the timedelta objects support addition operation, and the result is output to the console. Timedelta objects support operations like subtraction, multiplication, and division.
Working with Timezones
The use of timezones is necessary if we want to create aware date and time objects. An aware time or date object includes information on the timezone. It’s also important for displaying time or date objects in relation to a particular region.
zoneinfo
is a built-in Python module for working with timezones.
Example: Create a datetime object with timezone information
from datetime import datetime
from zoneinfo import ZoneInfo tz = ZoneInfo('Africa/Accra')
date_time_object = datetime.now(tz) print("Timezone information", date_time_object.tzinfo)
print("Timezone code", date_time_object.tzname())
Here’s the output for the code above:
Timezone information: Africa/Accra
Timezone code: GMT
First, we import the datetime
class from the datetime
module and ZoneInfo
from the zoneinfo
module. We create a ZoneInfo object and then a datetime object, but this time we pass the timezone object tz
to the now()
method.
When we check the value of the tzinfo
attribute, it returns the name of the timezone Africa/Accra
, not None
.
Example: Convert a datetime object from one timezone to another
from datetime import datetime
from zoneinfo import ZoneInfo accra_timezone = ZoneInfo('Africa/Accra')
accra_datetime = datetime.now(accra_timezone)
print("Current date time in Accra:", accra_datetime) new_york_timezone = ZoneInfo('America/New_York')
new_york_datetime = accra_datetime.astimezone(new_york_timezone)
print("Current date time in New York:", new_york_datetime)
Here’s the output of the code above:
Current date time in Accra 2023-04-20 10:42:02.476541+00:00
Current date time in New York 2023-04-20 06:42:02.476541-04:00
To convert between timezones, we use the astimezone()
method of the datetime object, passing in a new timezone object. The astimezone()
returns a new datetime object with updated timezone information.
Conclusion
Keeping track of time is an important aspect of our daily lives, and this also translates into programming. When we build real-world projects, there’s always the need to keep time logs for user activities like login and sign-out, among other use cases. It’s also important to put a time stamp on content generated online and to display time and date according to a user’s region or timezone.
To better manage times and dates in our programs or applications, Python provides the time
and datetime
modules. These modules have functions, classes and methods for managing time-related tasks. In this article, we’ve highlighted some commonly used functions and methods, providing examples of how they can be used.
The code for this tutorial can be found on GitHub.