How to convert a DateTime object to a string

Posted in Python by Dirk - last update: Feb 08, 2024

To convert a datetime object to a string format in Python, use the datetime.strftime() method with a specified format string.

from datetime import datetime

# Create a datetime object
now = datetime.now()

# Convert datetime to string with a specific format
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")

Introducing the DateTime module

in Python, the datetime module provides functionalities to work with dates and times. Often, you may need to convert strings representing dates or times into datetime objects for further manipulation or analysis. In this tutorial, we will explore how to convert strings to datetime objects using the datetime.strptime() method.

The datetime module in Python provides several classes for working with dates and times. These classes provide a flexible and powerful framework for working with dates and times in Python. By combining them and utilizing their methods, you can perform various operations, calculations, and manipulations with temporal data.

Additionally, the datetime module includes functions for formatting and parsing date and time strings (strftime and strptime). strftime will be discussed in more detail in the next section.

Here are the main classes in the datetime module:

datetime.date class

This class represents a date (year, month, day). The syntax to create a date object is datetime.date(year, month, day). Example:

from datetime import date

my_date = date(2024, 2, 7)
print(my_date)

Ouptut:

2024-02-07

datetime.time class

It represents a time of day (hour, minute, second, microsecond). The syntax to create a time object is datetime.time(hour, minute, second, microsecond).

from datetime import time

my_time = time(12, 30, 45)
print(my_time)

Result:

12:30:45

datetime.datetime class

This combines both date and time components. The syntax to create a datetime object is datetime.datetime(year, month, day, hour, minute, second, microsecond).

from datetime import datetime

my_datetime = datetime(2024, 2, 7, 12, 30, 45)

print(my_datetime)

Output:

2024-02-07 12:30:45

datetime.timedelta class

This class calculates the difference between two dates or times. Useful for performing arithmetic operations with dates and times. Example:

from datetime import datetime, timedelta

start_date = datetime(2024, 2, 1)
end_date = datetime(2024, 2, 7)

duration = end_date - start_date
print(duration.days)  # prints the number of days between start_date and end_date = 6

Output:

6

Converting DateTime to String using datetime.strftime()

The datetime.strftime() method stands for “string format time” and allows you to convert a datetime object to a string with a specified format. The syntax is as follows:

datetime_object.strftime(format)

with:

  • datetime_object: a datetime object that you want to format as a string.
  • format: a string specifying the format in which the datetime should be displayed. It consists of format codes that represent various components of the date and time (e.g., %Y for the year, %m for the month, %d for the day, etc.).
from datetime import datetime

# Create a datetime object for February 7, 2024
date_object = datetime(2024, 2, 7)

# Convert datetime to string with a specific format
formatted_date = date_object.strftime("%Y-%m-%d")

# Print the formatted date
print("Formatted Date:", formatted_date)

Output:

Formatted Date: 2024-02-07

In this example, date_object contains a date in datetime format. The date_object.strftime("%Y-%m-%d") will convert the date_object to a string with the specified format ("%Y-%m-%d"``). The resulting formatted_date``` will be a string representing the provided date in the requested format.

Here are some commonly used format codes:

  • %Y: Four-digit year (e.g. 2022)
  • %y: Two-digit year, without century (e.g. 22)
  • %m: Month (01-12)
  • %B: Full month name (e.g., January)
  • %b: Abbreviated month name (e.g., Jan)
  • %d: Day of the month (01-31)
  • %A: Full weekday name (e.g., Monday)
  • %a: Abbreviated weekday name (e.g., Mon)
  • %w: Weekday as Number, range 0 to 6, Sunday being 0
  • ``%u```: Weekday as Number, range 1 to 7, Monday being
  • %H: Hour (00-23)
  • %I: Hour (01-12)
  • %p: AM/PM
  • %M: Minute (00-59)
  • %S: Second (00-59)

A more exhaustive list can be found here

Potential Issues and Solutions

Invalid Format Codes:

Be careful with the format you provide. Python will not necessary raise a ValueError is you provide a bad date format. In the example below - the format provided does not exist. Still, the datetime.strftime() does the conversion to a string, even with the bad date fromat provided.

from datetime import datetime

now = datetime.now()

# Invalid format code 

formatted_date = now.strftime("%Y-%m-%T %k:%l:%S")

# Print the formatted date
print("Formatted Date:", formatted_date)

Output:

Formatted Date: 2024-02-09:31:05  9: 9:05

Solution: Make sure you validate the date format code is correct

Locale sensitivity

The output may vary based on the locale settings. For example, on a French locale, the day and month names will be in French.

Note: you can check the current locale by uing the locale.getlocale() function from the locale module

import locale
from datetime import datetime

# Set the locale to a non-English locale
locale.setlocale(locale.LC_TIME, 'fr_FR')

now = datetime.now()
formatted_date = now.strftime("%A, %B %d, %Y")
print("Formatted Date:", formatted_date)

Output:

Formatted Date: Jeudi, février 08, 2024

Solution: Define the locale using the locale.setlocale() function if you want to be certain on how the date is going to be formatted.

Platform differences

It’s important to be aware that the behavior of strftime can vary across different operating systems. Platform differences in the behavior of strftime are often related to the underlying C library used by Python on different operating systems. One common area where platform differences may occur is the representation of the week number.

For example, consider the following code:

from datetime import datetime

now = datetime.now()

# Use %U for the week number (Sunday as the first day of the week)
formatted_date = now.strftime("Week number (Sunday): %U")

print(formatted_date)

In this example, %U is used to represent the week number, considering Sunday as the first day of the week. However, the behavior of %U can be platform-dependent.

On Unix-like systems (Linux, macOS), %U follows the ISO week date system, where the week starts on Monday, and weeks start from 00 (partial week) or 01 (first full week) up to 53.

On Windows, the C library used by Python may follow a different convention for %U, where weeks always start from 00 (partial week) or 01 (first full week) up to 52.

This difference in behavior can lead to inconsistencies in the representation of week numbers between platforms. It’s essential to be aware of these variations when relying on specific format codes, especially those related to localized or platform-specific conventions.

Timezone issues

If your system’s timezone is not set to UTC, the %z (timezone offset) might not behave as expected. This issue can arise when the system’s timezone differs from the timezone information in the datetime object.

from datetime import datetime, timezone, timedelta

# Create a datetime object with timezone information
now_utc = datetime.now(timezone.utc)

# Convert datetime to string with a format including timezone
formatted_date = now_utc.strftime("%Y-%m-%d %H:%M:%S %z")

print("Formatted Date:", formatted_date)

Output:

Formatted Date: 2024-02-08 08:55:02 +0000

Other articles