How to work with datetime

онлайн тренажер по питону
Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Demystifying the Python Datetime Module: A Comprehensive Guide

The datetime module in Python offers powerful tools for manipulating dates and times. This library is essential for creating reports, performing analytics, scheduling events, and handling timestamps in various software projects.

Fundamentals of Working with the Datetime Module

Importing and Basic Classes

The datetime module is part of Python's standard library and doesn't require any additional installation.

import datetime
from datetime import date, time, datetime, timedelta, timezone

Key classes within the module include:

  • datetime.date: Working with dates (year, month, day)
  • datetime.time: Working with times (hours, minutes, seconds)
  • datetime.datetime: Combines date and time
  • datetime.timedelta: Represents the difference between dates/times
  • datetime.timezone: Handling time zones

Getting the Current Date and Time

from datetime import datetime, date

# Current date and time
now = datetime.now()
print(f"Current date and time: {now}")

# Only the current date
today = date.today()
print(f"Today's date: {today}")

Creating and Working with Dates

Creating Dates Manually

from datetime import date, datetime

# Creating a specific date
custom_date = date(2025, 5, 9)
print(f"Specified date: {custom_date}")

# Creating a date and time
custom_datetime = datetime(2025, 5, 9, 14, 30, 45)
print(f"Specified date and time: {custom_datetime}")

Extracting Date Components

today = date.today()
print(f"Year: {today.year}")
print(f"Month: {today.month}")
print(f"Day: {today.day}")
print(f"Day of the week: {today.weekday()}")  # 0 = Monday, 6 = Sunday

Working with Time

Creating and Manipulating Time Objects

from datetime import time

# Creating time
custom_time = time(14, 30, 45)
print(f"Specified time: {custom_time}")

# Extracting time components
print(f"Hours: {custom_time.hour}")
print(f"Minutes: {custom_time.minute}")
print(f"Seconds: {custom_time.second}")

Getting Time with Microseconds

from datetime import datetime

now = datetime.now()
print(f"Time with microseconds: {now}")
print(f"Microseconds: {now.microsecond}")

Arithmetic Operations with Dates

Using timedelta

from datetime import date, datetime, timedelta

# Operations with dates
today = date.today()
tomorrow = today + timedelta(days=1)
last_week = today - timedelta(weeks=1)
next_month = today + timedelta(days=30)

print(f"Tomorrow: {tomorrow}")
print(f"One week ago: {last_week}")
print(f"Next month: {next_month}")

# More complex operations
future_date = today + timedelta(days=100, hours=5, minutes=30)
print(f"In 100 days, 5 hours and 30 minutes: {future_date}")

Calculating the Difference Between Dates

from datetime import date, datetime

start_date = date(2025, 1, 1)
end_date = date(2025, 12, 31)

# Difference in days
difference = end_date - start_date
print(f"Difference in days: {difference.days}")

# Difference in seconds for datetime
start_time = datetime(2025, 5, 9, 10, 0, 0)
end_time = datetime(2025, 5, 9, 15, 30, 45)

time_diff = end_time - start_time
print(f"Difference in seconds: {time_diff.total_seconds()}")
print(f"Difference in hours: {time_diff.total_seconds() / 3600}")

Formatting Dates and Times

The strftime Method

from datetime import datetime

now = datetime.now()

# Various formats
print(now.strftime("%Y-%m-%d"))           # 2025-05-09
print(now.strftime("%d.%m.%Y"))           # 09.05.2025
print(now.strftime("%d %B %Y"))           # 09 May 2025
print(now.strftime("%A, %d %B %Y"))       # Friday, 09 May 2025
print(now.strftime("%H:%M:%S"))           # 14:30:45
print(now.strftime("%d-%m-%Y %H:%M:%S"))  # 09-05-2025 14:30:45

Essential Formatting Codes

  • %Y: Year (4 digits)
  • %y: Year (2 digits)
  • %m: Month (01-12)
  • %d: Day (01-31)
  • %H: Hour (00-23)
  • %I: Hour (01-12)
  • %M: Minute (00-59)
  • %S: Second (00-59)
  • %A: Full weekday name
  • %a: Abbreviated weekday name
  • %B: Full month name
  • %b: Abbreviated month name

Parsing Strings into Dates

The strptime Method

from datetime import datetime

# Parsing various formats
date_str1 = "09-05-2025"
parsed_date1 = datetime.strptime(date_str1, "%d-%m-%Y")

date_str2 = "2025-05-09 14:30:45"
parsed_date2 = datetime.strptime(date_str2, "%Y-%m-%d %H:%M:%S")

date_str3 = "May 9, 2025"
parsed_date3 = datetime.strptime(date_str3, "%B %d, %Y")

print(f"Parsed date 1: {parsed_date1}")
print(f"Parsed date 2: {parsed_date2}")
print(f"Parsed date 3: {parsed_date3}")

Handling Parsing Errors

from datetime import datetime

def safe_parse_date(date_string, format_string):
    try:
        return datetime.strptime(date_string, format_string)
    except ValueError as e:
        print(f"Parsing error: {e}")
        return None

# Example usage
result = safe_parse_date("32-05-2025", "%d-%m-%Y")  # Incorrect date
if result:
    print(f"Date successfully parsed: {result}")
else:
    print("Date not parsed")

Working with Time Zones

Basic Timezone Handling

from datetime import datetime, timezone, timedelta

# UTC time
utc_time = datetime.now(timezone.utc)
print(f"UTC time: {utc_time}")

# Creating a time zone
moscow_tz = timezone(timedelta(hours=3))
moscow_time = datetime.now(moscow_tz)
print(f"Moscow time: {moscow_time}")

# Converting between time zones
utc_dt = datetime.now(timezone.utc)
moscow_dt = utc_dt.astimezone(moscow_tz)
print(f"UTC: {utc_dt}")
print(f"Moscow: {moscow_dt}")

Working with the pytz Library

# Installation: pip install pytz
import pytz
from datetime import datetime

# List of available time zones
moscow_tz = pytz.timezone('Europe/Moscow')
ny_tz = pytz.timezone('America/New_York')
tokyo_tz = pytz.timezone('Asia/Tokyo')

# Creating time with a time zone
moscow_time = datetime.now(moscow_tz)
ny_time = moscow_time.astimezone(ny_tz)
tokyo_time = moscow_time.astimezone(tokyo_tz)

print(f"Moscow: {moscow_time}")
print(f"New York: {ny_time}")
print(f"Tokyo: {tokyo_time}")

Comparing Dates and Times

Comparison Operators

from datetime import date, datetime

# Comparing dates
date1 = date(2025, 5, 9)
date2 = date(2025, 6, 1)

print(f"date1 < date2: {date1 < date2}")
print(f"date1 > date2: {date1 > date2}")
print(f"date1 == date2: {date1 == date2}")

# Comparing times
time1 = datetime(2025, 5, 9, 10, 0, 0)
time2 = datetime(2025, 5, 9, 15, 30, 0)

if time1 < time2:
    print("time1 is earlier than time2")
    print(f"Difference: {time2 - time1}")

Checking Period Membership

from datetime import date, datetime

def is_weekend(check_date):
    """Checks if a date is a weekend day"""
    return check_date.weekday() >= 5  # 5 = Saturday, 6 = Sunday

def is_business_hours(check_time):
    """Checks if a time falls within business hours"""
    return 9 <= check_time.hour < 18

# Examples of use
today = date.today()
now = datetime.now()

print(f"Today is a weekend: {is_weekend(today)}")
print(f"It's business hours now: {is_business_hours(now)}")

Useful Functions and Methods

Getting Information About a Date

from datetime import date
import calendar

today = date.today()

# Day of the week
print(f"Day of the week number: {today.weekday()}")  # 0 = Monday
print(f"Day of the week number: {today.isoweekday()}")  # 1 = Monday
print(f"Day of the week name: {today.strftime('%A')}")

# Month information
print(f"Number of days in the month: {calendar.monthrange(today.year, today.month)[1]}")

# Checking for a leap year
print(f"Leap year: {calendar.isleap(today.year)}")

Working with the Beginning and End of Periods

from datetime import datetime, date
import calendar

def get_month_start_end(year, month):
    """Returns the first and last day of the month"""
    first_day = date(year, month, 1)
    last_day_num = calendar.monthrange(year, month)[1]
    last_day = date(year, month, last_day_num)
    return first_day, last_day

def get_week_start_end(check_date):
    """Returns the start and end of the week for a given date"""
    days_since_monday = check_date.weekday()
    monday = check_date - timedelta(days=days_since_monday)
    sunday = monday + timedelta(days=6)
    return monday, sunday

# Examples of use
year, month = 2025, 5
start, end = get_month_start_end(year, month)
print(f"Start of the month: {start}, end of the month: {end}")

today = date.today()
week_start, week_end = get_week_start_end(today)
print(f"Start of the week: {week_start}, end of the week: {week_end}")

Measuring Execution Time

Using time.time()

import time

start_time = time.time()

# Code to measure
sum_result = sum(range(1000000))

end_time = time.time()
execution_time = end_time - start_time

print(f"Execution time: {execution_time:.4f} seconds")

Using datetime for Measurement

from datetime import datetime

start = datetime.now()

# Code to measure
result = [i**2 for i in range(100000)]

end = datetime.now()
duration = end - start

print(f"Execution time: {duration.total_seconds():.4f} seconds")
print(f"Time in microseconds: {duration.microseconds}")

Working with External Libraries

The dateutil Library

# Installation: pip install python-dateutil
from datetime import datetime
from dateutil.relativedelta import relativedelta
from dateutil.parser import parse

# Adding months and years
now = datetime.now()
next_month = now + relativedelta(months=1)
next_year = now + relativedelta(years=1)
three_months_ago = now - relativedelta(months=3)

print(f"Next month: {next_month}")
print(f"Next year: {next_year}")
print(f"Three months ago: {three_months_ago}")

# Smart date parsing
flexible_date1 = parse("2025-05-09")
flexible_date2 = parse("May 9, 2025")
flexible_date3 = parse("09/05/2025")

print(f"Flexible parsing 1: {flexible_date1}")
print(f"Flexible parsing 2: {flexible_date2}")
print(f"Flexible parsing 3: {flexible_date3}")

The arrow Library

# Installation: pip install arrow
import arrow

# Creating and working with dates
now = arrow.now()
utc_now = arrow.utcnow()

print(f"Current time: {now}")
print(f"UTC time: {utc_now}")

# Formatting
print(f"Readable format: {now.format('YYYY-MM-DD HH:mm:ss')}")
print(f"Human-readable: {now.humanize()}")

# Operations with dates
future = now.shift(days=30, hours=2)
print(f"In 30 days and 2 hours: {future}")

Practical Examples

Age Calculator

from datetime import date

def calculate_age(birth_date):
    """Calculates age in years"""
    today = date.today()
    age = today.year - birth_date.year
    
    # Check if the birthday has already occurred this year
    if today.month < birth_date.month or (today.month == birth_date.month and today.day < birth_date.day):
        age -= 1
    
    return age

# Example usage
birth = date(1990, 3, 15)
age = calculate_age(birth)
print(f"Age: {age} years")

Task Scheduler

from datetime import datetime, timedelta

class Task:
    def __init__(self, name, due_date):
        self.name = name
        self.due_date = due_date
    
    def days_until_due(self):
        """Number of days until due"""
        today = datetime.now().date()
        if isinstance(self.due_date, datetime):
            due_date = self.due_date.date()
        else:
            due_date = self.due_date
        
        delta = due_date - today
        return delta.days
    
    def is_overdue(self):
        """Checks if the task is overdue"""
        return self.days_until_due() < 0

# Example usage
tasks = [
    Task("Prepare report", date(2025, 5, 15)),
    Task("Meeting with client", date(2025, 5, 8)),
    Task("Update documentation", date(2025, 5, 20))
]

for task in tasks:
    days = task.days_until_due()
    status = "Overdue" if task.is_overdue() else f"Remaining {days} days"
    print(f"{task.name}: {status}")

Best Practices

Working with Time Zones

from datetime import datetime, timezone

# Always use timezone-aware objects for critical applications
def create_utc_datetime(year, month, day, hour=0, minute=0, second=0):
    """Creates UTC datetime"""
    return datetime(year, month, day, hour, minute, second, tzinfo=timezone.utc)

# Example
utc_dt = create_utc_datetime(2025, 5, 9, 12, 0, 0)
print(f"UTC time: {utc_dt}")

# Converting to local time
local_dt = utc_dt.astimezone()
print(f"Local time: {local_dt}")

Date Validation

from datetime import datetime

def validate_date_range(start_date, end_date):
    """Validates a date range"""
    if not isinstance(start_date, datetime) or not isinstance(end_date, datetime):
        raise ValueError("Dates must be datetime objects")
    
    if start_date >= end_date:
        raise ValueError("Start date must be earlier than end date")
    
    return True

# Example usage
try:
    start = datetime(2025, 5, 9)
    end = datetime(2025, 5, 15)
    validate_date_range(start, end)
    print("Date range is valid")
except ValueError as e:
    print(f"Validation error: {e}")

Frequently Asked Questions

How to Find the Last Day of a Month?

import calendar
from datetime import date

def last_day_of_month(year, month):
    """Returns the last day of the month"""
    return calendar.monthrange(year, month)[1]

# Example
year, month = 2025, 2
last_day = last_day_of_month(year, month)
print(f"Last day of February 2025: {last_day}")

How to Round Time to the Nearest Hour?

from datetime import datetime, timedelta

def round_to_nearest_hour(dt):
    """Rounds the time to the nearest hour"""
    if dt.minute >= 30:
        return dt.replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)
    else:
        return dt.replace(minute=0, second=0, microsecond=0)

# Example
now = datetime.now()
rounded = round_to_nearest_hour(now)
print(f"Current time: {now}")
print(f"Rounded time: {rounded}")

How to Get All Dates in a Range?

from datetime import date, timedelta

def date_range(start_date, end_date):
    """Generates all dates in a range"""
    current = start_date
    while current <= end_date:
        yield current
        current += timedelta(days=1)

# Example usage
start = date(2025, 5, 1)
end = date(2025, 5, 7)

print("All dates in the range:")
for date_obj in date_range(start, end):
    print(date_obj.strftime("%Y-%m-%d (%A)"))

How to Work with Business Days?

from datetime import date, timedelta

def is_business_day(check_date):
    """Checks if a date is a business day"""
    return check_date.weekday() < 5  # 0-4 = Mon-Fri

def add_business_days(start_date, days):
    """Adds a number of business days to a date"""
    current = start_date
    added_days = 0
    
    while added_days < days:
        current += timedelta(days=1)
        if is_business_day(current):
            added_days += 1
    
    return current

# Example
start = date(2025, 5, 9)  # Friday
result = add_business_days(start, 5)
print(f"5 business days after {start}: {result}")

The datetime module provides all the necessary tools for effective date and time manipulation in Python. Use this knowledge to create robust applications that correctly handle temporal data.

News