5 Best Ways to Format Time in Python (yyyy-mm-dd hh:mm:ss)

πŸ’‘ Problem Formulation: When working with times and dates in Python, it might be necessary to format and display them in a human-readable format such as ‘yyyy-mm-dd hh:mm:ss’. This is crucial for logging, reports, user interfaces, and time data manipulation. Let’s say you have a Python datetime object and your goal is to format it as ‘2023-04-12 15:30:45’.

Method 1: Using strftime method

The strftime method is the most common approach for formatting dates and times in Python. It belongs to the datetime class and allows for custom format strings, where ‘%Y-%m-%d %H:%M:%S’ represents the desired format ‘yyyy-mm-dd hh:mm:ss’.

Here’s an example:

from datetime import datetime
print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

Output:

'2023-04-12 15:30:45'

This code snippet imports the datetime module and prints the current date and time using datetime.now() to fetch the current timestamp and then strftime method to convert this timestamp to a human-readable string format.

Method 2: Using f-strings with datetime object

Python 3.6 introduced f-strings, providing a way to embed expressions inside string literals. When dealing with a datetime object, you can directly inline format properties to construct the desired string format.

Here’s an example:

from datetime import datetime
now = datetime.now()
formatted_time = f'{now.year}-{now.month:02d}-{now.day:02d} {now.hour:02d}:{now.minute:02d}:{now.second:02d}'
print(formatted_time)

Output:

'2023-04-12 15:30:45'

The above snippet demonstrates how to use an f-string to format a datetime object. It accesses the year, month, day, hour, minute, and second attributes individually, formatting them as needed – zero padding on single-digit months, days, etc., with :02d.

Method 3: Using format() function

The format() function in Python can be used to format strings. When combined with a datetime object, you can use this function to piece together a date string in the desired format.

Here’s an example:

from datetime import datetime
now = datetime.now()
formatted_time = "{0}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}".format(now.year, now.month, now.day, now.hour, now.minute, now.second)
print(formatted_time)

Output:

'2023-04-12 15:30:45'

By using the format() method, the code inserts the year, month, day, hour, minute, and second into the string, with zero-padding provided by the :02d format specifier for each value.

Method 4: Using string concatenation

Though not as elegant or recommended, string concatenation can also be utilized to format date and time. You convert each part of the datetime object to a string and then manually add them together with the appropriate separators.

Here’s an example:

from datetime import datetime
now = datetime.now()
formatted_time = str(now.year) + '-' + str(now.month).zfill(2) + '-' + str(now.day).zfill(2) + ' ' + str(now.hour).zfill(2) + ':' + str(now.minute).zfill(2) + ':' + str(now.second).zfill(2)
print(formatted_time)

Output:

'2023-04-12 15:30:45'

This method manually constructs the date string by converting each datetime component to a string and padding with zeroes where necessary using the zfill() method. This approach is verbose and more prone to errors due to the manual handling involved.

Bonus One-Liner Method 5: Using pendulum library

The Pendulum library is a third-party package that enhances datetime objects and simplifies date-time manipulation. It comes with a very convenient to_datetime_string() method.

Here’s an example:

import pendulum
print(pendulum.now().to_datetime_string())

Output:

'2023-04-12 15:30:45'

In this example, we use the pendulum library’s now() function to get the current time and to_datetime_string() to convert it to the ‘yyyy-mm-dd hh:mm:ss’ format. Pendulum automatically formats the datetime according to the ISO 8601 standard.

Summary/Discussion

  • Method 1: strftime. Versatile and standard way in Python. Best for a custom format. Requires memorizing format codes.
  • Method 2: F-strings with datetime attributes. Modern and concise. Limited to Python 3.6 and above. Less explicit format codes.
  • Method 3: format() function. Flexible and pythonic. More explicit than f-strings but slightly more verbose. Compatible with older Python versions.
  • Method 4: String concatenation. Straightforward but cumbersome. Error-prone and not recommended for complex formatting.
  • Bonus Method 5: Pendulum library. Simplified and clean. Third-party dependency. Handles time zones and daylight saving time gracefully.