Formatting Date and Time in Python

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

CodeMeaningExample
%YYear with century2023
%yYear without century23
%mMonth (01-12)12
%BFull month nameDecember
%bAbbreviated monthDec
%dDay of month (01-31)25
%AFull weekday nameMonday
%aAbbreviated weekdayMon
%HHour (00-23)14
%IHour (01-12)02
%MMinute (00-59)30
%SSecond (00-59)45
%fMicrosecond123456
%pAM/PMPM
%jDay 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:

  1. Use strftime() to convert datetime objects to formatted strings
  2. Use strptime() to convert formatted strings to datetime objects
  3. Learn common format codes like %Y%m%d%H%M%S
  4. Create custom formatters for specific application needs
  5. 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!

Similar Posts

  • What is general-purpose programming language

    A general-purpose programming language is a language designed to be used for a wide variety of tasks and applications, rather than being specialized for a particular domain. They are versatile tools that can be used to build anything from web applications and mobile apps to desktop software, games, and even operating systems. Here’s a breakdown…

  • Python Statistics Module

    Python Statistics Module: Complete Methods Guide with Examples Here’s a detailed explanation of each method in the Python statistics module with 3 practical examples for each: 1. Measures of Central Tendency mean() – Arithmetic Average python import statistics as stats # Example 1: Basic mean calculation data1 = [1, 2, 3, 4, 5] result1 = stats.mean(data1) print(f”Mean of…

  • File Handling in Python

    File Handling in Python File handling is a crucial aspect of programming that allows you to read from and write to files. Python provides built-in functions and methods to work with files efficiently. Basic File Operations 1. Opening a File Use the open() function to open a file. It returns a file object. python # Syntax: open(filename,…

  • Dynamically Typed vs. Statically Typed Languages 🔄↔️

    Dynamically Typed vs. Statically Typed Languages 🔄↔️ Dynamically Typed Languages 🚀 Python Pros: Cons: Statically Typed Languages 🔒 Java Pros: Cons: Key Differences 🆚 Feature Dynamically Typed Statically Typed Type Checking Runtime Compile-time Variable Types Can change during execution Fixed after declaration Error Detection Runtime exceptions Compile-time failures Speed Slower (runtime checks) Faster (optimized binaries)…

  • Static Methods

    The primary use of a static method in Python classes is to define a function that logically belongs to the class but doesn’t need access to the instance’s data (like self) or the class’s state (like cls). They are essentially regular functions that are grouped within a class namespace. Key Characteristics and Use Cases General…

  • Unlock the Power of Python: What is Python, History, Uses, & 7 Amazing Applications

    What is Python and History of python, different sectors python used Python is one of the most popular programming languages worldwide, known for its versatility and beginner-friendliness . From web development to data science and machine learning, Python has become an indispensable tool for developers and tech professionals across various industries . This blog post…

Leave a Reply

Your email address will not be published. Required fields are marked *