Formatting Date and Time in Python
Python provides powerful formatting options for dates and times using the strftime() method and parsing using strptime() method.
from datetime import *
# Create a datetime object for 2010, January 1st at 10:20:30
dt1 = datetime(2010, 1, 1, 10, 20, 30)
# Display the datetime object (output shown in the image)
# datetime.datetime(2010, 1, 1, 10, 20, 30)
# Format the datetime object using specific directives
dt1.strftime('%d %B, %A %Y. %H:%M:%S')
# Format the datetime object using alternative directives
dt1.strftime('%-d %b, %a %y. %H:%M:%S')
# The string to be converted
str1 = '10 Jan 2015, 10:15:30'
# Check the type of the variable (output shown in the image)
# type(str1)
# <class 'str'>
# Convert the string (str1) into a datetime object (dt2)
# The format string ('%d %b %Y, %H:%M:%S') exactly matches the structure of str1
dt2 = datetime.strptime(str1, '%d %b %Y, %H:%M:%S')
# Display the resulting datetime object (output shown in the image)
# datetime.datetime(2015, 1, 10, 10, 15, 30)
1. Basic Formatting with strftime()
Date Formatting
python
from datetime import date, datetime
# Current date
today = date.today()
print("Date Formatting Examples:")
print(f"Default: {today}")
print(f"YYYY-MM-DD: {today.strftime('%Y-%m-%d')}")
print(f"MM/DD/YYYY: {today.strftime('%m/%d/%Y')}")
print(f"DD-MM-YYYY: {today.strftime('%d-%m-%Y')}")
print(f"Full month: {today.strftime('%B %d, %Y')}")
print(f"Abbr month: {today.strftime('%b %d, %Y')}")
print(f"Day name: {today.strftime('%A, %B %d, %Y')}")
# Output:
# Default: 2023-12-25
# YYYY-MM-DD: 2023-12-25
# MM/DD/YYYY: 12/25/2023
# DD-MM-YYYY: 25-12-2023
# Full month: December 25, 2023
# Abbr month: Dec 25, 2023
# Day name: Monday, December 25, 2023
Time Formatting
python
from datetime import time, datetime
# Current time
now = datetime.now().time()
print("\nTime Formatting Examples:")
print(f"24-hour: {now.strftime('%H:%M:%S')}")
print(f"12-hour: {now.strftime('%I:%M:%S %p')}")
print(f"Short time: {now.strftime('%I:%M %p')}")
print(f"With milliseconds: {now.strftime('%H:%M:%S.%f')}")
# Output:
# 24-hour: 14:30:45
# 12-hour: 02:30:45 PM
# Short time: 02:30 PM
# With milliseconds: 14:30:45.123456
DateTime Formatting
python
from datetime import datetime
current_dt = datetime.now()
print("\nDateTime Formatting Examples:")
print(f"Full: {current_dt.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Readable: {current_dt.strftime('%A, %B %d, %Y at %I:%M %p')}")
print(f"File friendly: {current_dt.strftime('%Y%m%d_%H%M%S')}")
print(f"SQL format: {current_dt.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"US format: {current_dt.strftime('%m/%d/%Y %I:%M %p')}")
print(f"EU format: {current_dt.strftime('%d/%m/%Y %H:%M')}")
# Output:
# Full: 2023-12-25 14:30:45
# Readable: Monday, December 25, 2023 at 02:30 PM
# File friendly: 20231225_143045
# SQL format: 2023-12-25 14:30:45
# US format: 12/25/2023 02:30 PM
# EU format: 25/12/2023 14:30
2. Common Format Codes
| Code | Meaning | Example |
|---|---|---|
%Y | Year with century | 2023 |
%y | Year without century | 23 |
%m | Month (01-12) | 12 |
%B | Full month name | December |
%b | Abbreviated month | Dec |
%d | Day of month (01-31) | 25 |
%A | Full weekday name | Monday |
%a | Abbreviated weekday | Mon |
%H | Hour (00-23) | 14 |
%I | Hour (01-12) | 02 |
%M | Minute (00-59) | 30 |
%S | Second (00-59) | 45 |
%f | Microsecond | 123456 |
%p | AM/PM | PM |
%j | Day of year (001-366) | 359 |
3. Practical Formatting Examples
Logging Format
python
from datetime import datetime
def log_message(level, message):
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f"[{timestamp}] [{level.upper()}] {message}")
# Usage
log_message("info", "Application started")
log_message("error", "Database connection failed")
log_message("warning", "Low disk space")
# Output:
# [2023-12-25 14:30:45] [INFO] Application started
# [2023-12-25 14:30:46] [ERROR] Database connection failed
# [2023-12-25 14:30:47] [WARNING] Low disk space
File Naming Convention
python
from datetime import datetime
def generate_filename(prefix, extension="txt"):
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
return f"{prefix}_{timestamp}.{extension}"
# Usage
files = [
generate_filename("report"),
generate_filename("backup", "zip"),
generate_filename("log", "log")
]
for file in files:
print(f"Generated: {file}")
# Output:
# Generated: report_20231225_143045.txt
# Generated: backup_20231225_143045.zip
# Generated: log_20231225_143045.log
User-Friendly Display
python
from datetime import datetime, timedelta
def format_relative_time(dt):
now = datetime.now()
diff = now - dt
if diff.days == 0:
if diff.seconds < 60:
return "Just now"
elif diff.seconds < 3600:
return f"{diff.seconds // 60} minutes ago"
else:
return f"{diff.seconds // 3600} hours ago"
elif diff.days == 1:
return "Yesterday"
elif diff.days < 7:
return f"{diff.days} days ago"
else:
return dt.strftime('%B %d, %Y')
# Test with different times
test_times = [
datetime.now() - timedelta(minutes=5),
datetime.now() - timedelta(hours=2),
datetime.now() - timedelta(days=1),
datetime.now() - timedelta(days=3),
datetime.now() - timedelta(days=10)
]
print("Relative Time Formatting:")
for time in test_times:
formatted = format_relative_time(time)
print(f"{time} -> {formatted}")
4. Parsing Strings with strptime()
Basic Parsing
python
from datetime import datetime
# Parse different date formats
date_strings = [
"2023-12-25",
"12/25/2023",
"25-12-2023 14:30:45",
"December 25, 2023",
"25 Dec 2023 02:30 PM"
]
formats = [
'%Y-%m-%d',
'%m/%d/%Y',
'%d-%m-%Y %H:%M:%S',
'%B %d, %Y',
'%d %b %Y %I:%M %p'
]
print("String to DateTime Parsing:")
for date_str, fmt in zip(date_strings, formats):
parsed_dt = datetime.strptime(date_str, fmt)
print(f"'{date_str}' -> {parsed_dt}")
Advanced Parsing Examples
python
from datetime import datetime
def parse_flexible_date(date_string):
"""Try multiple date formats"""
formats = [
'%Y-%m-%d',
'%m/%d/%Y',
'%d-%m-%Y',
'%B %d, %Y',
'%b %d, %Y',
'%Y%m%d',
'%d/%m/%Y %H:%M:%S',
'%m/%d/%Y %I:%M %p'
]
for fmt in formats:
try:
return datetime.strptime(date_string, fmt)
except ValueError:
continue
raise ValueError(f"Unable to parse date: {date_string}")
# Test with various date strings
test_dates = [
"2023-12-25",
"12/25/2023",
"25-12-2023",
"December 25, 2023",
"Dec 25, 2023",
"20231225",
"25/12/2023 14:30:45",
"12/25/2023 02:30 PM"
]
print("Flexible Date Parsing:")
for date_str in test_dates:
try:
parsed = parse_flexible_date(date_str)
print(f"✓ '{date_str}' -> {parsed}")
except ValueError as e:
print(f"✗ {e}")
5. Custom Formatting Functions
Multi-language Date Formatting
python
from datetime import datetime
class DateFormatter:
def __init__(self, language='en'):
self.language = language
self.months_en = {
1: 'January', 2: 'February', 3: 'March', 4: 'April',
5: 'May', 6: 'June', 7: 'July', 8: 'August',
9: 'September', 10: 'October', 11: 'November', 12: 'December'
}
self.months_es = {
1: 'Enero', 2: 'Febrero', 3: 'Marzo', 4: 'Abril',
5: 'Mayo', 6: 'Junio', 7: 'Julio', 8: 'Agosto',
9: 'Septiembre', 10: 'Octubre', 11: 'Noviembre', 12: 'Diciembre'
}
def format_custom(self, dt, format_type='long'):
if self.language == 'en':
months = self.months_en
else:
months = self.months_es
if format_type == 'long':
return f"{months[dt.month]} {dt.day}, {dt.year}"
elif format_type == 'short':
return f"{dt.month}/{dt.day}/{dt.year}"
elif format_type == 'numeric':
return f"{dt.year}-{dt.month:02d}-{dt.day:02d}"
# Usage
formatter_en = DateFormatter('en')
formatter_es = DateFormatter('es')
current_dt = datetime.now()
print("Multi-language Formatting:")
print(f"English long: {formatter_en.format_custom(current_dt, 'long')}")
print(f"Spanish long: {formatter_es.format_custom(current_dt, 'long')}")
print(f"Short: {formatter_en.format_custom(current_dt, 'short')}")
print(f"Numeric: {formatter_en.format_custom(current_dt, 'numeric')}")
Template-based Formatting
python
from datetime import datetime
import re
class TemplateFormatter:
def __init__(self):
self.templates = {
'log': '[{date} {time}] {message}',
'file': '{prefix}_{date}_{time}.{ext}',
'display': 'Today is {weekday}, {month} {day}, {year}',
'sql': '{year}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}'
}
def format(self, template_name, dt, **kwargs):
template = self.templates.get(template_name)
if not template:
raise ValueError(f"Unknown template: {template_name}")
# Extract date components
components = {
'date': dt.strftime('%Y-%m-%d'),
'time': dt.strftime('%H:%M:%S'),
'year': dt.year,
'month': dt.month,
'day': dt.day,
'hour': dt.hour,
'minute': dt.minute,
'second': dt.second,
'weekday': dt.strftime('%A'),
'month_name': dt.strftime('%B')
}
# Add custom kwargs
components.update(kwargs)
# Format the template
return template.format(**components)
# Usage
formatter = TemplateFormatter()
current_dt = datetime.now()
print("Template-based Formatting:")
print(formatter.format('log', current_dt, message='System started'))
print(formatter.format('file', current_dt, prefix='backup', ext='zip'))
print(formatter.format('display', current_dt))
print(formatter.format('sql', current_dt))
6. Complete Example: Event Formatter
python
from datetime import datetime, timedelta
class EventFormatter:
@staticmethod
def format_event_summary(event_name, start_dt, end_dt):
"""Format event information in a user-friendly way"""
# Date formatting
if start_dt.date() == end_dt.date():
# Same day event
date_str = start_dt.strftime('%A, %B %d, %Y')
time_str = f"{start_dt.strftime('%I:%M %p')} - {end_dt.strftime('%I:%M %p')}"
else:
# Multi-day event
date_str = f"{start_dt.strftime('%b %d')} to {end_dt.strftime('%b %d, %Y')}"
time_str = f"Starts: {start_dt.strftime('%I:%M %p')}"
# Duration
duration = end_dt - start_dt
hours = duration.total_seconds() / 3600
return f"""
Event: {event_name}
Date: {date_str}
Time: {time_str}
Duration: {hours:.1f} hours
"""
@staticmethod
def format_calendar_entry(event_name, dt, reminder_minutes=0):
"""Format for calendar applications"""
reminder_time = dt - timedelta(minutes=reminder_minutes)
return f"""
BEGIN:VEVENT
SUMMARY:{event_name}
DTSTART:{dt.strftime('%Y%m%dT%H%M%S')}
DTEND:{(dt + timedelta(hours=1)).strftime('%Y%m%dT%H%M%S')}
REMINDER:{reminder_time.strftime('%Y%m%dT%H%M%S')}
END:VEVENT
""".strip()
# Usage
event_formatter = EventFormatter()
# Create test events
meeting_start = datetime(2023, 12, 26, 14, 0, 0)
meeting_end = datetime(2023, 12, 26, 15, 30, 0)
conference_start = datetime(2023, 12, 27, 9, 0, 0)
conference_end = datetime(2023, 12, 28, 17, 0, 0)
print("Event Formatting Examples:")
print(event_formatter.format_event_summary("Team Meeting", meeting_start, meeting_end))
print(event_formatter.format_event_summary("Tech Conference", conference_start, conference_end))
print(event_formatter.format_calendar_entry("Team Meeting", meeting_start, 15))
Key Takeaways:
- Use
strftime()to convert datetime objects to formatted strings - Use
strptime()to convert formatted strings to datetime objects - Learn common format codes like
%Y,%m,%d,%H,%M,%S - Create custom formatters for specific application needs
- Handle multiple formats when parsing user input
These formatting techniques are essential for displaying dates and times in user-friendly ways and for parsing date strings from various sources!