Python: уроки, справочник и задачи

Задачи на дату и время в Python с решениями

Раздел: Модули и библиотеки Python · Обновлено 31.10.2026

Задачи на дату и время в Python помогают закрепить работу с модулем datetime: разбор строк, арифметику дат через timedelta, форматирование и часовые пояса. Ниже 30 упражнений с готовым кодом, от подсчета дней до праздника до проверки пересечения встреч. Перед практикой посмотрите короткую шпаргалку по классам и кодам формата, она пригодится почти в каждом решении.

Язык программирования Python предоставляет мощные инструменты для работы с датой и временем. В этой статье мы рассмотрим основные возможности, которые предоставляет Python для работы с датами и временем.

Python Дата Время
Фото: Godot13 / CC BY-SA 4.0, Wikimedia Commons
Содержание статьи
  1. Модуль datetime
  2. Задача 1: Подсчет количества дней до определенной даты
  3. Решение задачи
  4. Задача 2: Форматирование времени в определенный формат
  5. Решение задачи 2
  6. Задача 3: Перевод времени из одного часового пояса в другой
  7. Решение задачи 3
  8. Задача 4: Определение дня недели для определенной даты
  9. Решение задачи 4
  10. Задача 5: Подсчет времени выполнения кода
  11. Решение задачи 5
  12. Задача 6: Создание таймера обратного отсчета
  13. Решение задачи 6
  14. Задача 7: Поиск разницы между двумя датами
  15. Решение задачи 7
  16. Задача 8: Генерация списка дат в определенном диапазоне
  17. Решение задачи 8
  18. Задача 9: Проверка на високосный год
  19. Решение задачи 9
  20. Задача 10: Вычисление возраста по дате рождения
  21. Решение задачи 10
  22. Задача 11: Поиск следующего рабочего дня
  23. Решение задачи 11
  24. Задача 12: Подсчет количества рабочих дней между двумя датами
  25. Решение задачи 12
  26. Задача 13: Подсчет времени выполнения функции
  27. Решение задачи 13
  28. Задача 14: Определение количества дней до следующего дня рождения
  29. Решение задачи 14
  30. Задача 15: Проверка пересечения двух периодов времени
  31. Решение задачи 15
  32. Задача 16: Подсчет времени работы над проектом
  33. Решение задачи 16
  34. Задача 17: Определение даты через определенное количество рабочих дней
  35. Решение задачи 17
  36. Задача 18: Вычисление времени окончания операции
  37. Решение задачи 18
  38. Задача 19: Подсчет количества рабочих часов
  39. Решение задачи 19
  40. Задача 20: Проверка наличия свободного времени
  41. Решение задачи 20
  42. Задача 21: Подсчет времени до ближайшего праздника
  43. Решение задачи 21
  44. Задача 22: Подсчет времени, проведенного на уроках
  45. Решение задачи 22
  46. Задача 23: Проверка пересечения двух периодов времени
  47. Решение задачи 23
  48. Задача 24: Определение часового пояса
  49. Решение задачи 24
  50. Задача 25: Расчет времени выполнения задачи
  51. Решение задачи 25
  52. Задача 26: Проверка момента времени
  53. Решение задачи 26
  54. Задача 27: Подсчет количества выходных дней в периоде
  55. Решение задачи 27
  56. Задача 28: Расчет возраста по дате рождения
  57. Решение задачи 28
  58. Задача 29: Определение дня недели
  59. Решение задачи 29
  60. Задача 30: Подсчет количества дней до ближайшего дня рождения
  61. Решение задачи 30
  62. Шпаргалка по классам и форматам datetime
  63. Дополнительные задачи
  64. Частые вопросы

Модуль datetime

В Python для работы с датой и временем используется модуль datetime. Этот модуль позволяет создавать объекты для представления даты, времени и даты-времени, а также проводить операции над этими объектами.

Ниже представлен список практических задач Python Дата Время. Решение практических задач позволит закрепить вам теоретические знания на практике.

Задача 1: Подсчет количества дней до определенной даты

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

Решение задачи

from datetime import datetime
def days_until(target_date):
    current_date = datetime.now().date()
    target_date = datetime.strptime(target_date, '%Y-%m-%d').date()
    
    days_left = (target_date - current_date).days
    return days_left
target_date = '2030-01-01'
print(f"До {target_date} осталось {days_until(target_date)} дней.")

Задача 2: Форматирование времени в определенный формат

Вам необходимо создать функцию, которая принимает время в формате ЧЧ:ММ:СС и возвращает его в формате Часы AM/PM: Минуты.

Решение задачи 2

from datetime import datetime
def format_time(input_time):
    time_obj = datetime.strptime(input_time, '%H:%M:%S').time()
    formatted_time = time_obj.strftime('%I:%M %p')
    return formatted_time
input_time = '13:45:30'
print(f"Отформатированное время: {format_time(input_time)}")

Задача 3: Перевод времени из одного часового пояса в другой

Напишите программу, которая позволит пользователю ввести время и указать текущий и желаемый часовой пояс для перевода времени.

Решение задачи 3

from zoneinfo import ZoneInfo
from datetime import datetime
def convert_timezone(input_time, current_timezone, desired_timezone):
    current_tz = ZoneInfo(current_timezone)
    desired_tz = ZoneInfo(desired_timezone)
    
    time_obj = datetime.strptime(input_time, '%H:%M:%S')
    time_obj = datetime.combine(datetime.now().date(), time_obj.time())
    current_time = time_obj.replace(tzinfo=current_tz)
    desired_time = current_time.astimezone(desired_tz)
    
    return desired_time.time()
input_time = '10:30:00'
current_timezone = 'America/New_York'
desired_timezone = 'Asia/Tokyo'
print(f"Переведенное время: {convert_timezone(input_time, current_timezone, desired_timezone)}")

Задача 4: Определение дня недели для определенной даты

Напишите программу, которая запрашивает у пользователя ввод даты в формате гггг-мм-дд и выводит соответствующий день недели.

Решение задачи 4

from datetime import datetime
def get_weekday(input_date):
    input_date = datetime.strptime(input_date, '%Y-%m-%d').date()
    weekdays = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]
    return weekdays[input_date.weekday()]
input_date = '2022-10-15'
print(f"День недели для {input_date}: {get_weekday(input_date)}")

Задача 5: Подсчет времени выполнения кода

Необходимо написать функцию-декоратор для измерения времени выполнения других функций.

Решение задачи 5

import time
def measure_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        print(f"Время выполнения {func.__name__}: {end_time - start_time} секунд")
        return result
    return wrapper
@measure_time
def example_function():
    time.sleep(2)
example_function()

Задача 6: Создание таймера обратного отсчета

Напишите программу для создания таймера обратного отсчета, который принимает количество секунд и выводит обновляющееся время до завершения отсчета.

Решение задачи 6

import time
def countdown_timer(seconds):
    while seconds > 0:
        print(f"Осталось времени: {seconds} секунд")
        time.sleep(1)
        seconds -= 1
    print("Отсчет завершен!")
countdown_timer(10)

Задача 7: Поиск разницы между двумя датами

Напишите функцию, которая принимает на вход две даты и вычисляет разницу между ними в днях, часах и минутах.

Решение задачи 7

from datetime import datetime, timedelta
def time_diff(start_date, end_date):
    start = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
    end = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')
    time_difference = end - start
    days_diff = time_difference.days
    hours_diff = time_difference.seconds // 3600
    minutes_diff = (time_difference.seconds // 60) % 60
    return days_diff, hours_diff, minutes_diff
start_date = '2022-01-01 12:00:00'
end_date = '2022-01-10 18:30:00'
days, hours, minutes = time_diff(start_date, end_date)
print(f"Разница между датами: {days} дней, {hours} часов, {minutes} минут")

Задача 8: Генерация списка дат в определенном диапазоне

Напишите функцию, которая принимает начальную и конечную даты, а затем генерирует список дат в этом диапазоне с определенным шагом.

Решение задачи 8

from datetime import datetime, timedelta
def date_range(start_date, end_date, step):
    dates_list = []
    current_date = datetime.strptime(start_date, '%Y-%m-%d')
    end = datetime.strptime(end_date, '%Y-%m-%d')
    while current_date <= end:
        dates_list.append(current_date.strftime('%Y-%m-%d'))
        current_date += timedelta(days=step)
    return dates_list
start_date = '2022-01-01'
end_date = '2022-01-15'
step = 3
print(f"Список дат: {date_range(start_date, end_date, step)}")

Задача 9: Проверка на високосный год

Напишите функцию, которая принимает год в качестве аргумента и проверяет, является ли он високосным.

Решение задачи 9

def is_leap_year(year):
    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
        return True
    else:
        return False
year = 2024
if is_leap_year(year):
    print(f"{year} год является високосным.")
else:
    print(f"{year} год не является високосным.")

Задача 10: Вычисление возраста по дате рождения

Напишите программу, которая запрашивает у пользователя дату его рождения и затем вычисляет и выводит его текущий возраст.

Решение задачи 10

from datetime import datetime
def calculate_age(birth_date):
    birth_date = datetime.strptime(birth_date, '%Y-%m-%d')
    current_date = datetime.now()
    age = current_date.year - birth_date.year - ((current_date.month, current_date.day) < (birth_date.month, birth_date.day))
    return age
user_birth_date = '1990-05-15'
print(f"Ваш текущий возраст: {calculate_age(user_birth_date)} лет")

Задача 11: Поиск следующего рабочего дня

Напишите функцию, которая принимает текущую дату и возвращает следующий рабочий день (понедельник-пятница). Если текущий день пятница, то вернуть понедельник следующей недели.

Решение задачи 11

from datetime import datetime, timedelta
def next_business_day(current_date):
    current_date = datetime.strptime(current_date, '%Y-%m-%d')
    one_day = timedelta(days=1)
    while True:
        current_date += one_day
        if current_date.weekday() < 5:  # Проверка на будний день (0-4 - понедельник-пятница)
            return current_date.strftime('%Y-%m-%d')
user_current_date = '2022-10-15'
print(f"Следующий рабочий день: {next_business_day(user_current_date)}")

Задача 12: Подсчет количества рабочих дней между двумя датами

Напишите функцию, которая принимает начальную и конечную даты и возвращает количество рабочих дней между ними (исключая выходные).

Решение задачи 12

from datetime import datetime, timedelta
def count_business_days(start_date, end_date):
    start = datetime.strptime(start_date, '%Y-%m-%d')
    end = datetime.strptime(end_date, '%Y-%m-%d')
    one_day = timedelta(days=1)
    business_days = 0
    while start <= end:
        if start.weekday() < 5:  # Проверка на будний день (0-4 - понедельник-пятница)
            business_days += 1
        start += one_day
    return business_days
start_date = '2022-10-01'
end_date = '2022-10-15'
print(f"Количество рабочих дней между датами: {count_business_days(start_date, end_date)}")

Задача 13: Подсчет времени выполнения функции

Напишите функцию-декоратор, которая измеряет время выполнения других функций и выводит результат.

Решение задачи 13

import time
def measure_execution_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Время выполнения функции {func.__name__}: {end_time - start_time} секунд")
        return result
    return wrapper
@measure_execution_time
def example_function():
    time.sleep(2)
example_function()

Задача 14: Определение количества дней до следующего дня рождения

Напишите программу, которая запрашивает у пользователя его день рождения и затем выводит количество дней до его следующего дня рождения.

Решение задачи 14

from datetime import datetime, timedelta
def days_until_birthday(birth_date):
    today = datetime.now().date()
    next_birthday = birth_date.replace(year=today.year)
    if next_birthday < today:
        next_birthday = next_birthday.replace(year=today.year + 1)
    days_left = (next_birthday - today).days
    return days_left
user_birth_date = datetime.strptime('1990-05-15', '%Y-%m-%d').date()
print(f"До вашего следующего дня рождения осталось {days_until_birthday(user_birth_date)} дней")

Задача 15: Проверка пересечения двух периодов времени

Напишите функцию, которая принимает на вход два периода времени и проверяет, есть ли у них хотя бы одна общая дата.

Решение задачи 15

from datetime import datetime
def check_time_periods_overlap(start1, end1, start2, end2):
    if start1 <= end2 and start2 <= end1:
        return True
    else:
        return False
start1 = datetime(2023, 1, 1)
end1 = datetime(2023, 1, 15)
start2 = datetime(2023, 1, 10)
end2 = datetime(2023, 1, 20)
print(f"Пересекаются ли периоды времени: {check_time_periods_overlap(start1, end1, start2, end2)}")

Задача 16: Подсчет времени работы над проектом

Напишите программу для учета времени работы над проектом. Программа должна записывать время начала и окончания работы над проектом, а затем выводить общее затраченное время.

Решение задачи 16

from datetime import datetime
start_time = datetime.now()
# Здесь выполняется работа над проектом
end_time = datetime.now()
total_time = end_time - start_time
print(f"Общее затраченное время: {total_time}")

Задача 17: Определение даты через определенное количество рабочих дней

Напишите программу, которая принимает текущую дату и количество рабочих дней, а затем определяет дату, наступающую через указанное количество рабочих дней.

Решение задачи 17

from datetime import datetime, timedelta
def next_business_day(current_date, business_days):
    current_date = datetime.strptime(current_date, '%Y-%m-%d')
    one_day = timedelta(days=1)
    while business_days > 0:
        current_date += one_day
        if current_date.weekday() < 5:  # Проверка на будний день (0-4 - понедельник-пятница)
            business_days -= 1
    return current_date.strftime('%Y-%m-%d')
user_current_date = '2022-10-15'
business_days = 10
print(f"Дата через {business_days} рабочих дней: {next_business_day(user_current_date, business_days)}")

Задача 18: Вычисление времени окончания операции

Напишите функцию, которая принимает время начала операции и ожидаемое время выполнения в минутах, а затем вычисляет время окончания операции.

Решение задачи 18

from datetime import datetime, timedelta
def calculate_end_time(start_time, minutes_to_complete):
    start_time = datetime.strptime(start_time, '%H:%M')
    end_time = start_time + timedelta(minutes=minutes_to_complete)
    return end_time.strftime('%H:%M')
operation_start = '12:00'
expected_duration_minutes = 90
print(f"Ожидаемое время окончания операции: {calculate_end_time(operation_start, expected_duration_minutes)}")

Задача 19: Подсчет количества рабочих часов

Напишите программу, которая принимает начальное и конечное время работы над проектом (в формате ЧЧ:ММ) и вычисляет общее количество отработанных рабочих часов.

Решение задачи 19

from datetime import datetime
def calculate_working_hours(start_time, end_time):
    start = datetime.strptime(start_time, '%H:%M')
    end = datetime.strptime(end_time, '%H:%M')
    working_hours = (end - start).seconds / 3600
    return working_hours
start_time = '09:00'
end_time = '17:30'
print(f"Общее количество рабочих часов: {calculate_working_hours(start_time, end_time)} часов")

Задача 20: Проверка наличия свободного времени

Напишите функцию, которая принимает список запланированных встреч (время начала и конца) и новую встречу. Функция должна определить, есть ли у пользователя свободное время между встречами для новой встречи.

Решение задачи 20

from datetime import datetime, timedelta
def check_free_time(schedule, new_meeting):
    schedule.sort(key=lambda x: datetime.strptime(x[0], '%H:%M'))
    for i in range(len(schedule) - 1):
        end_current = datetime.strptime(schedule[i][1], '%H:%M')
        start_next = datetime.strptime(schedule[i + 1][0], '%H:%M')
        if start_next - end_current >= timedelta(minutes=new_meeting):
            return True
    return False
user_schedule = [['09:00', '10:30'], ['11:00', '12:30'], ['14:00', '15:30']]
new_meeting_duration = 60
print(f"Есть ли свободное время для новой встречи: {check_free_time(user_schedule, new_meeting_duration)}")

Задача 21: Подсчет времени до ближайшего праздника

Напишите программу, которая определяет текущую дату и вычисляет сколько дней осталось до ближайшего праздника (например, Новый год).

Решение задачи 21

from datetime import datetime
def days_until_holiday(holidays):
    current_date = datetime.now().date()
    holidays.sort()
    for holiday_date in holidays:
        if holiday_date > current_date:
            days_left = (holiday_date - current_date).days
            return days_left
year = datetime.now().year
upcoming_holidays = [datetime(year, 12, 31).date(), datetime(year + 1, 1, 1).date(), datetime(year + 1, 1, 7).date()]
print(f"До ближайшего праздника осталось {days_until_holiday(upcoming_holidays)} дней")

Задача 22: Подсчет времени, проведенного на уроках

Напишите программу, которая запрашивает пользователя ввести время начала и время окончания каждого урока за день. Программа должна вычислить общее время, проведенное на уроках за день.

Решение задачи 22

from datetime import datetime
def calculate_total_lesson_time():
    total_lesson_time = 0
    num_lessons = int(input("Введите количество уроков за день: "))
    
    for i in range(num_lessons):
        start_time = input(f"Введите время начала урока {i+1} (ЧЧ:ММ): ")
        end_time = input(f"Введите время окончания урока {i+1} (ЧЧ:ММ): ")
        
        start = datetime.strptime(start_time, '%H:%M')
        end = datetime.strptime(end_time, '%H:%M')
        lesson_duration = (end - start).seconds / 60  # Преобразуем разницу в минуты
        total_lesson_time += lesson_duration
    
    return total_lesson_time
total_time = calculate_total_lesson_time()
print(f"Общее время, проведенное на уроках за день: {total_time} минут")

Задача 23: Проверка пересечения двух периодов времени

Напишите функцию, которая принимает на вход два периода времени и проверяет, пересекаются ли они. Каждый период задается временами его начала и окончания.

Решение задачи 23

from datetime import datetime
def check_time_periods_overlap(start1, end1, start2, end2):
    if start1 < end2 and start2 < end1:
        return True
    else:
        return False
start1 = datetime(2023, 1, 1, 12, 0)
end1 = datetime(2023, 1, 1, 14, 0)
start2 = datetime(2023, 1, 1, 13, 0)
end2 = datetime(2023, 1, 1, 15, 0)
print(f"Периоды времени пересекаются: {check_time_periods_overlap(start1, end1, start2, end2)}")

Задача 24: Определение часового пояса

Напишите программу, которая определяет текущий часовой пояс операционной системы.

Решение задачи 24

import time
def get_current_timezone():
    utc_offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
    hours = abs(utc_offset) // 3600
    minutes = (abs(utc_offset) % 3600) // 60
    sign = '+' if utc_offset <= 0 else '-'
    return f"Текущий часовой пояс: UTC{sign}{hours:02}:{minutes:02}"
print(get_current_timezone())

Задача 25: Расчет времени выполнения задачи

Напишите программу, которая принимает время начала и время окончания выполнения задачи и вычисляет общее затраченное время в формате ЧЧ:ММ:СС.

Решение задачи 25

from datetime import datetime
def calculate_task_duration(start_time, end_time):
    start = datetime.strptime(start_time, '%H:%M:%S')
    end = datetime.strptime(end_time, '%H:%M:%S')
    duration = end - start
    total_seconds = duration.total_seconds()
    hours = int(total_seconds // 3600)
    minutes = int((total_seconds % 3600) // 60)
    seconds = int(total_seconds % 60)
    return f"Общее затраченное время: {hours:02}:{minutes:02}:{seconds:02}"
start_time = '08:45:00'
end_time = '12:30:15'
print(calculate_task_duration(start_time, end_time))

Задача 26: Проверка момента времени

Напишите функцию, которая принимает время и определяет, является ли оно утром, днем, вечером или ночью.

Решение задачи 26

from datetime import datetime
def time_of_day_check(current_time):
    current_time = datetime.strptime(current_time, '%H:%M:%S').time()
    if current_time.hour < 6:
        return "Ночь"
    elif 6 <= current_time.hour < 12:
        return "Утро"
    elif 12 <= current_time.hour < 18:
        return "День"
    else:
        return "Вечер"
current_time = '20:45:00'
print(f"Текущее время: {current_time}, время суток: {time_of_day_check(current_time)}")

Задача 27: Подсчет количества выходных дней в периоде

Напишите программу, которая принимает начальную и конечную даты периода (включительно) и вычисляет количество выходных дней в этом периоде.

Решение задачи 27

from datetime import datetime, timedelta
def count_weekend_days(start_date, end_date):
    current_date = datetime.strptime(start_date, '%Y-%m-%d')
    end_date = datetime.strptime(end_date, '%Y-%m-%d')
    weekend_count = 0
    while current_date <= end_date:
        if current_date.weekday() >= 5:  # Проверка на выходные (5-6 - суббота-воскресенье)
            weekend_count += 1
        current_date += timedelta(days=1)
    return weekend_count
start_date = '2023-10-01'
end_date = '2023-10-31'
print(f"Количество выходных дней: {count_weekend_days(start_date, end_date)}")

Задача 28: Расчет возраста по дате рождения

Напишите программу, которая запрашивает у пользователя дату рождения в формате (ГГГГ-ММ-ДД) и вычисляет текущий возраст пользователя.

Решение задачи 28

from datetime import datetime
def calculate_age(birthdate):
    birthdate = datetime.strptime(birthdate, '%Y-%m-%d')
    current_date = datetime.now()
    age = current_date.year - birthdate.year - ((current_date.month, current_date.day) < (birthdate.month, birthdate.day))
    return age
birthdate = input("Введите дату рождения (ГГГГ-ММ-ДД): ")
print(f"Ваш текущий возраст: {calculate_age(birthdate)} лет")

Задача 29: Определение дня недели

Напишите функцию, которая принимает дату в формате (ГГГГ-ММ-ДД) и определяет день недели, к которому эта дата относится.

Решение задачи 29

from datetime import datetime
def get_weekday(date):
    date = datetime.strptime(date, '%Y-%m-%d').weekday()
    weekdays = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]
    return weekdays[date]
date = '2023-11-15'
print(f"День недели для {date}: {get_weekday(date)}")

Задача 30: Подсчет количества дней до ближайшего дня рождения

Напишите программу, которая запрашивает у пользователя свою дату рождения и вычисляет количество дней до ближайшего дня рождения.

Решение задачи 30

from datetime import datetime
def days_until_birthday(birthdate):
    today = datetime.now().date()
    birthdate = datetime.strptime(birthdate, '%Y-%m-%d').date().replace(year=today.year)
    if birthdate < today:
        birthdate = birthdate.replace(year=today.year + 1)
    days_left = (birthdate - today).days
    return days_left
birthdate = input("Введите дату рождения (ГГГГ-ММ-ДД): ")
print(f"До вашего следующего дня рождения осталось: {days_until_birthday(birthdate)} дней")

Шпаргалка по классам и форматам datetime

Модуль datetime содержит несколько классов. Почти все задачи ниже решаются комбинацией трех из них: date, datetime и timedelta.

КлассЧто хранитПример создания
dateГод, месяц, деньdate(2025, 3, 15)
timeЧасы, минуты, секунды, микросекундыtime(14, 30)
datetimeДату и время вместе, можно с часовым поясомdatetime(2025, 3, 15, 14, 30)
timedeltaПромежуток времени: дни, секунды, микросекундыtimedelta(days=3, hours=2)

Строку в дату превращает datetime.strptime(), дату в строку strftime(). Обе функции используют одинаковые коды формата.

КодЗначениеПример
%YГод из четырех цифр2025
%mМесяц 01-1203
%dДень месяца 01-3115
%H / %IЧас в 24- и 12-часовом формате14 / 02
%M, %SМинуты и секунды30, 05
%pAM или PMPM
%A, %aНазвание дня неделиSaturday, Sat

Подробный разбор форматов есть в статьях про strftime и strptime, а арифметика интервалов описана на странице про timedelta.

Часовые пояса без сторонних библиотек

С Python 3.9 в стандартной библиотеке есть модуль zoneinfo, поэтому устанавливать pytz для перевода времени между поясами не нужно. Пояс передается в параметр tzinfo, а пересчет делает метод astimezone(). На Windows базе поясов может понадобиться пакет tzdata (pip install tzdata).

from datetime import datetime
from zoneinfo import ZoneInfo

moscow = datetime(2025, 3, 15, 12, 0, tzinfo=ZoneInfo("Europe/Moscow"))
print(moscow.astimezone(ZoneInfo("Asia/Tokyo")))
# 2025-03-15 18:00:00+09:00

Объект без часового пояса называется наивным. Сравнивать или вычитать наивный и осведомленный datetime нельзя: Python выбросит TypeError. Полный список возможностей модуля приведен в официальной документации datetime.

Дополнительные задачи

Две задачи на частые ситуации из реальных программ: разбор русского формата даты и вывод интервала в читаемом виде.

Задача 31: Разбор даты в формате ДД.ММ.ГГГГ ЧЧ:ММ

Пользователь вводит строку вида 15.03.2025 14:30. Преобразуйте ее в объект datetime и выведите в формате ISO. Если строка не подходит под формат, программа должна сообщить об ошибке, а не завершаться с трассировкой.

Решение:

from datetime import datetime

def parse_ru(text):
    try:
        return datetime.strptime(text, "%d.%m.%Y %H:%M")
    except ValueError:
        return None

result = parse_ru("15.03.2025 14:30")
print(result.isoformat() if result else "Неверный формат")
# 2025-03-15T14:30:00

Задача 32: Интервал в виде "N дн. ЧЧ:ММ"

Дан объект timedelta. Выведите его в виде количества дней и времени в часах и минутах. Учтите, что у timedelta нет атрибутов hours и minutes, их нужно вычислить из seconds.

Решение:

from datetime import timedelta

def pretty(delta):
    hours, rest = divmod(delta.seconds, 3600)
    minutes = rest // 60
    return f"{delta.days} дн. {hours:02}:{minutes:02}"

print(pretty(timedelta(days=2, hours=5, minutes=7)))
# 2 дн. 05:07

Частые вопросы

Короткие ответы на вопросы, которые возникают при решении задач на даты.

Как получить текущую дату без времени?

Вызовите date.today() или datetime.now().date(). Оба варианта вернут объект date с годом, месяцем и днем, который удобно сравнивать с другими датами.

Почему разница дат в днях иногда меньше на единицу?

Атрибут days у timedelta отбрасывает неполные сутки. Если вычитать из полуночи текущий момент datetime.now(), остаток часов теряется. Для подсчета дней сравнивайте объекты date, а не datetime.

Чем time.perf_counter() лучше time.time() для замера скорости?

perf_counter() использует монотонные часы с максимальной точностью и не зависит от перевода системного времени. time.time() подходит для меток времени, но для измерения длительности кода менее надежен.

Как узнать номер дня недели?

Метод weekday() возвращает 0 для понедельника и 6 для воскресенья, а isoweekday() дает 1-7. Название дня на английском выводит strftime("%A").

Нужна ли библиотека pytz в новых проектах?

Для большинства задач нет: модуль zoneinfo из стандартной библиотеки работает с базой IANA и корректно учитывает переход на летнее время. pytz встречается в старом коде и требует особого метода localize().