Как работать с датами в datetime

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Модуль datetime в Python предоставляет мощные инструменты для работы с датами и временем. Эта библиотека необходима для создания отчетов, аналитики, планирования событий и обработки временных меток в любых программных проектах.

Основы работы с модулем datetime

Импорт и основные классы

Модуль datetime входит в стандартную библиотеку Python и не требует дополнительной установки:

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

Основные классы модуля:

  • datetime.date — работа с датами (год, месяц, день)
  • datetime.time — работа со временем (часы, минуты, секунды)
  • datetime.datetime — комбинирует дату и время
  • datetime.timedelta — представляет разницу между датами/временем
  • datetime.timezone — работа с часовыми поясами

Получение текущей даты и времени

from datetime import datetime, date

# Текущая дата и время
now = datetime.now()
print(f"Текущая дата и время: {now}")

# Только текущая дата
today = date.today()
print(f"Сегодняшняя дата: {today}")

Создание и работа с датами

Создание дат вручную

from datetime import date, datetime

# Создание конкретной даты
custom_date = date(2025, 5, 9)
print(f"Заданная дата: {custom_date}")

# Создание даты и времени
custom_datetime = datetime(2025, 5, 9, 14, 30, 45)
print(f"Заданная дата и время: {custom_datetime}")

Извлечение компонентов даты

today = date.today()
print(f"Год: {today.year}")
print(f"Месяц: {today.month}")
print(f"День: {today.day}")
print(f"День недели: {today.weekday()}")  # 0 = понедельник, 6 = воскресенье

Работа со временем

Создание и работа с объектами времени

from datetime import time

# Создание времени
custom_time = time(14, 30, 45)
print(f"Заданное время: {custom_time}")

# Извлечение компонентов времени
print(f"Часы: {custom_time.hour}")
print(f"Минуты: {custom_time.minute}")
print(f"Секунды: {custom_time.second}")

Получение времени с микросекундами

from datetime import datetime

now = datetime.now()
print(f"Время с микросекундами: {now}")
print(f"Микросекунды: {now.microsecond}")

Арифметические операции с датами

Использование timedelta

from datetime import date, datetime, timedelta

# Операции с датами
today = date.today()
tomorrow = today + timedelta(days=1)
last_week = today - timedelta(weeks=1)
next_month = today + timedelta(days=30)

print(f"Завтра: {tomorrow}")
print(f"Неделю назад: {last_week}")
print(f"Через месяц: {next_month}")

# Более сложные операции
future_date = today + timedelta(days=100, hours=5, minutes=30)
print(f"Через 100 дней, 5 часов и 30 минут: {future_date}")

Вычисление разности между датами

from datetime import date, datetime

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

# Разность в днях
difference = end_date - start_date
print(f"Разница в днях: {difference.days}")

# Разность в секундах для 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"Разница в секундах: {time_diff.total_seconds()}")
print(f"Разница в часах: {time_diff.total_seconds() / 3600}")

Форматирование дат и времени

Метод strftime

from datetime import datetime

now = datetime.now()

# Различные форматы
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

Основные коды форматирования

  • %Y — год (4 цифры)
  • %y — год (2 цифры)
  • %m — месяц (01-12)
  • %d — день (01-31)
  • %H — час (00-23)
  • %I — час (01-12)
  • %M — минута (00-59)
  • %S — секунда (00-59)
  • %A — полное название дня недели
  • %a — сокращенное название дня недели
  • %B — полное название месяца
  • %b — сокращенное название месяца

Парсинг строк в даты

Метод strptime

from datetime import datetime

# Парсинг различных форматов
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"Распознанная дата 1: {parsed_date1}")
print(f"Распознанная дата 2: {parsed_date2}")
print(f"Распознанная дата 3: {parsed_date3}")

Обработка ошибок при парсинге

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"Ошибка парсинга: {e}")
        return None

# Пример использования
result = safe_parse_date("32-05-2025", "%d-%m-%Y")  # Некорректная дата
if result:
    print(f"Дата успешно распознана: {result}")
else:
    print("Дата не распознана")

Работа с часовыми поясами

Базовая работа с timezone

from datetime import datetime, timezone, timedelta

# UTC время
utc_time = datetime.now(timezone.utc)
print(f"UTC время: {utc_time}")

# Создание часового пояса
moscow_tz = timezone(timedelta(hours=3))
moscow_time = datetime.now(moscow_tz)
print(f"Московское время: {moscow_time}")

# Преобразование между часовыми поясами
utc_dt = datetime.now(timezone.utc)
moscow_dt = utc_dt.astimezone(moscow_tz)
print(f"UTC: {utc_dt}")
print(f"Москва: {moscow_dt}")

Работа с библиотекой pytz

# Установка: pip install pytz
import pytz
from datetime import datetime

# Список доступных часовых поясов
moscow_tz = pytz.timezone('Europe/Moscow')
ny_tz = pytz.timezone('America/New_York')
tokyo_tz = pytz.timezone('Asia/Tokyo')

# Создание времени с часовым поясом
moscow_time = datetime.now(moscow_tz)
ny_time = moscow_time.astimezone(ny_tz)
tokyo_time = moscow_time.astimezone(tokyo_tz)

print(f"Москва: {moscow_time}")
print(f"Нью-Йорк: {ny_time}")
print(f"Токио: {tokyo_time}")

Сравнение дат и времени

Операторы сравнения

from datetime import date, datetime

# Сравнение дат
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}")

# Сравнение времени
time1 = datetime(2025, 5, 9, 10, 0, 0)
time2 = datetime(2025, 5, 9, 15, 30, 0)

if time1 < time2:
    print("time1 раньше time2")
    print(f"Разница: {time2 - time1}")

Проверка принадлежности к периоду

from datetime import date, datetime

def is_weekend(check_date):
    """Проверяет, является ли дата выходным днем"""
    return check_date.weekday() >= 5  # 5 = суббота, 6 = воскресенье

def is_business_hours(check_time):
    """Проверяет, попадает ли время в рабочие часы"""
    return 9 <= check_time.hour < 18

# Примеры использования
today = date.today()
now = datetime.now()

print(f"Сегодня выходной: {is_weekend(today)}")
print(f"Сейчас рабочее время: {is_business_hours(now)}")

Полезные функции и методы

Получение информации о дате

from datetime import date
import calendar

today = date.today()

# День недели
print(f"Номер дня недели: {today.weekday()}")  # 0 = понедельник
print(f"Номер дня недели: {today.isoweekday()}")  # 1 = понедельник
print(f"Название дня недели: {today.strftime('%A')}")

# Информация о месяце
print(f"Количество дней в месяце: {calendar.monthrange(today.year, today.month)[1]}")

# Проверка високосного года
print(f"Високосный год: {calendar.isleap(today.year)}")

Работа с началом и концом периодов

from datetime import datetime, date
import calendar

def get_month_start_end(year, 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):
    """Возвращает начало и конец недели для заданной даты"""
    days_since_monday = check_date.weekday()
    monday = check_date - timedelta(days=days_since_monday)
    sunday = monday + timedelta(days=6)
    return monday, sunday

# Примеры использования
year, month = 2025, 5
start, end = get_month_start_end(year, month)
print(f"Начало месяца: {start}, конец месяца: {end}")

today = date.today()
week_start, week_end = get_week_start_end(today)
print(f"Начало недели: {week_start}, конец недели: {week_end}")

Измерение времени выполнения

Использование time.time()

import time

start_time = time.time()

# Код для измерения
sum_result = sum(range(1000000))

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

print(f"Время выполнения: {execution_time:.4f} секунд")

Использование datetime для измерения

from datetime import datetime

start = datetime.now()

# Код для измерения
result = [i**2 for i in range(100000)]

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

print(f"Время выполнения: {duration.total_seconds():.4f} секунд")
print(f"Время в микросекундах: {duration.microseconds}")

Работа с внешними библиотеками

Библиотека dateutil

# Установка: pip install python-dateutil
from datetime import datetime
from dateutil.relativedelta import relativedelta
from dateutil.parser import parse

# Добавление месяцев и лет
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}")
print(f"Следующий год: {next_year}")
print(f"Три месяца назад: {three_months_ago}")

# Умный парсинг дат
flexible_date1 = parse("2025-05-09")
flexible_date2 = parse("May 9, 2025")
flexible_date3 = parse("09/05/2025")

print(f"Гибкий парсинг 1: {flexible_date1}")
print(f"Гибкий парсинг 2: {flexible_date2}")
print(f"Гибкий парсинг 3: {flexible_date3}")

Библиотека arrow

# Установка: pip install arrow
import arrow

# Создание и работа с датами
now = arrow.now()
utc_now = arrow.utcnow()

print(f"Текущее время: {now}")
print(f"UTC время: {utc_now}")

# Форматирование
print(f"Читаемый формат: {now.format('YYYY-MM-DD HH:mm:ss')}")
print(f"Человекочитаемый: {now.humanize()}")

# Операции с датами
future = now.shift(days=30, hours=2)
print(f"Через 30 дней и 2 часа: {future}")

Практические примеры

Калькулятор возраста

from datetime import date

def calculate_age(birth_date):
    """Вычисляет возраст в годах"""
    today = date.today()
    age = today.year - birth_date.year
    
    # Проверяем, был ли день рождения в этом году
    if today.month < birth_date.month or (today.month == birth_date.month and today.day < birth_date.day):
        age -= 1
    
    return age

# Пример использования
birth = date(1990, 3, 15)
age = calculate_age(birth)
print(f"Возраст: {age} лет")

Планировщик задач

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):
        """Количество дней до срока выполнения"""
        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):
        """Проверяет, просрочена ли задача"""
        return self.days_until_due() < 0

# Пример использования
tasks = [
    Task("Подготовить отчет", date(2025, 5, 15)),
    Task("Встреча с клиентом", date(2025, 5, 8)),
    Task("Обновить документацию", date(2025, 5, 20))
]

for task in tasks:
    days = task.days_until_due()
    status = "Просрочено" if task.is_overdue() else f"Осталось {days} дней"
    print(f"{task.name}: {status}")

Лучшие практики

Работа с часовыми поясами

from datetime import datetime, timezone

# Всегда используйте timezone-aware объекты для критичных приложений
def create_utc_datetime(year, month, day, hour=0, minute=0, second=0):
    """Создает UTC datetime"""
    return datetime(year, month, day, hour, minute, second, tzinfo=timezone.utc)

# Пример
utc_dt = create_utc_datetime(2025, 5, 9, 12, 0, 0)
print(f"UTC время: {utc_dt}")

# Конвертация в локальное время
local_dt = utc_dt.astimezone()
print(f"Локальное время: {local_dt}")

Валидация дат

from datetime import datetime

def validate_date_range(start_date, end_date):
    """Валидирует диапазон дат"""
    if not isinstance(start_date, datetime) or not isinstance(end_date, datetime):
        raise ValueError("Даты должны быть объектами datetime")
    
    if start_date >= end_date:
        raise ValueError("Дата начала должна быть раньше даты окончания")
    
    return True

# Пример использования
try:
    start = datetime(2025, 5, 9)
    end = datetime(2025, 5, 15)
    validate_date_range(start, end)
    print("Диапазон дат валиден")
except ValueError as e:
    print(f"Ошибка валидации: {e}")

Часто задаваемые вопросы

Как узнать последний день месяца?

import calendar
from datetime import date

def last_day_of_month(year, month):
    """Возвращает последний день месяца"""
    return calendar.monthrange(year, month)[1]

# Пример
year, month = 2025, 2
last_day = last_day_of_month(year, month)
print(f"Последний день февраля 2025: {last_day}")

Как округлить время до ближайшего часа?

from datetime import datetime, timedelta

def round_to_nearest_hour(dt):
    """Округляет время до ближайшего часа"""
    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)

# Пример
now = datetime.now()
rounded = round_to_nearest_hour(now)
print(f"Текущее время: {now}")
print(f"Округленное время: {rounded}")

Как получить все даты в диапазоне?

from datetime import date, timedelta

def date_range(start_date, end_date):
    """Генерирует все даты в диапазоне"""
    current = start_date
    while current <= end_date:
        yield current
        current += timedelta(days=1)

# Пример использования
start = date(2025, 5, 1)
end = date(2025, 5, 7)

print("Все даты в диапазоне:")
for date_obj in date_range(start, end):
    print(date_obj.strftime("%Y-%m-%d (%A)"))

Как работать с рабочими днями?

from datetime import date, timedelta

def is_business_day(check_date):
    """Проверяет, является ли дата рабочим днем"""
    return check_date.weekday() < 5  # 0-4 = пн-пт

def add_business_days(start_date, days):
    """Добавляет количество рабочих дней к дате"""
    current = start_date
    added_days = 0
    
    while added_days < days:
        current += timedelta(days=1)
        if is_business_day(current):
            added_days += 1
    
    return current

# Пример
start = date(2025, 5, 9)  # Пятница
result = add_business_days(start, 5)
print(f"Через 5 рабочих дней после {start}: {result}")

Модуль datetime предоставляет все необходимые инструменты для эффективной работы с датами и временем в Python. Используйте эти знания для создания надежных приложений, корректно обрабатывающих временные данные.

Новости