Дата и время в Python 3: полный обзор возможностей и практические примеры

Раздел: Python -> Время и даты

Работа с временем в Python 3: основные подходы и модули

Основной и наиболее эффективный способ работы с датой и временем в Python 3 - модуль datetime. Он предоставляет классы date, time, datetime, timedelta и timezone. С его помощью можно выполнять практически любые операции: создание текущего момента, форматирование, арифметику интервалов, учёт часовых поясов.

from datetime import datetime, timedelta, timezone

now = datetime.now()
print(now)                         # 2025-03-29 15:42:10.123456
print(now.strftime('%Y-%m-%d %H:%M:%S'))  # форматированный вывод

# Арифметика с временем
tomorrow = now + timedelta(days=1)
delta = tomorrow - now
print(delta.days)                  # 1

время создания python (время создания файла/объекта в python)

Этот подход покрывает 90 % типовых задач. При необходимости более тонкого контроля (например, измерение времени выполнения) используют time.perf_counter или timeit.

Как получить текущее время в разных форматах?

Используйте datetime.now() для локального времени или datetime.utcnow() для UTC. Форматирование выполняется методом strftime с директивами:

from datetime import datetime

now = datetime.now()
print(now.strftime('%d.%m.%Y %H:%M'))       # 29.03.2025 15:42
print(now.strftime('%A, %d %B %Y'))         # Saturday, 29 March 2025

время сообщения python (время сообщения (метка времени) в python)

Ошибка: неверная директива %I без %p приводит к 12-часовому формату без AM/PM. Используйте %I:%M %p.

Цель: получение удобочитаемой строки для логов, интерфейсов или файлов.

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

Модуль time предоставляет монотонные счётчики perf_counter (с наивысшим разрешением) и process_time (только процессорное время). Для простых замеров:

import time

start = time.perf_counter()
# какой-то код
result = sum(range(10**6))
end = time.perf_counter()
print(f'Выполнено за {end - start:.4f} сек')

дата и время в python (работа с датой и временем в python)

Типичная ошибка: использование time.time() для коротких интервалов - оно подвержено системным корректировкам и даёт неточные результаты. perf_counter лишён этой проблемы.

Для точных повторяющихся замеров лучше подходит модуль timeit, который автоматически отключает сборщик мусора и использует perf_counter.

import timeit

t = timeit.timeit('sum(range(1000))', number=10000)
print(f'Среднее время: {t/10000:.6f} сек')

модуль время python (модуль time в python)

Цель: профилирование производительности, поиск узких мест.

Как работать с часовыми поясами?

Начиная с Python 3.9 рекомендуется использовать модуль zoneinfo. Для более старых версий применяют стороннюю библиотеку pytz. Пример с zoneinfo:

from datetime import datetime
from zoneinfo import ZoneInfo

now_utc = datetime.now(ZoneInfo('UTC'))
now_msk = now_utc.astimezone(ZoneInfo('Europe/Moscow'))
print(now_msk.strftime('%Y-%m-%d %H:%M %Z'))

Python определить время (определение времени в python)

Ошибка: игнорирование перехода на летнее время (DST). zoneinfo и pytz корректно обрабатывают DST, если указан регион (не фиксированное смещение).

Цель: корректное отображение времени в разных регионах, обработка логов с метками времени из разных источников.

Как преобразовать строку в объект datetime?

Метод strptime требует точного формата. Если формат неизвестен или может меняться, удобна библиотека dateutil.parser:

from datetime import datetime

date_str = '2025-03-29 15:42:10'
dt = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')

Python время года (определение времени года по дате в python)

from dateutil import parser

dt = parser.parse('29 Mar 2025 3:42 PM')
print(dt)  # 2025-03-29 15:42:00

Python реальное время (получение реального времени в python)

Ошибка: несоответствие шаблона и строки приводит к ValueError. dateutil.parser может неправильно интерпретировать неоднозначные форматы (например, 03/04/2025 - март или апрель?).

Цель: импорт данных из файлов, баз данных, веб-форм.

Как организовать задержку или таймер?

Простая задержка - time.sleep(seconds). Для асинхронного выполнения используйте threading.Timer:

import time

print('Начало')
time.sleep(2.5)
print('Прошло 2.5 секунды')

время в секунды python (преобразование времени в секунды в python)

from threading import Timer

def hello():
    print('Выполнено через 3 секунды')

t = Timer(3.0, hello)
t.start()

Python datetime время (работа с datetime в python)

Ошибка: sleep блокирует поток. В асинхронном коде используйте asyncio.sleep.

Цель: паузы в скриптах, отложенные задачи, тайм-ауты.

Как получить день недели, номер недели или календарь?

Модуль calendar и методы экземпляров datetime:

from datetime import datetime
import calendar

now = datetime.now()
print(now.weekday())       # 0-6 (пн-вс)
print(now.isoweekday())    # 1-7 (пн-вс)
print(now.isocalendar())   # (год, номер_недели, день_недели)

cal = calendar.month(2025, 3)
print(cal)

Python 3 время (работа с временем в python 3)

Ошибка: путаница между weekday() (0=пн) и isoweekday() (1=пн). Проверяйте документацию.

Цель: построение отчётов, расписаний, календарных виджетов.

Как работать с интервалами времени (timedelta)?

timedelta поддерживает сложение, вычитание, умножение на число. Можно получить общее количество секунд:

from datetime import timedelta, datetime

delta = timedelta(days=5, hours=3, minutes=30)
print(delta.total_seconds())   # 462600.0

# Применение к дате
now = datetime.now()
after_10_days = now + timedelta(days=10)
print(after_10_days)

Python задать время (установка времени в python)

Ограничение: timedelta не может превышать datetime.max (~9999 год) или быть меньше datetime.min.

Цель: расчёт сроков, дедлайнов, периодов между событиями.

Как преобразовать timestamp в datetime и обратно?

Используйте datetime.fromtimestamp() и datetime.timestamp():

from datetime import datetime

ts = 1711726930
dt = datetime.fromtimestamp(ts)          # локальное время
print(dt)

# обратно
ts_back = dt.timestamp()
print(ts_back)

Python функция времени (функции для работы со временем в python)

Ошибка: fromtimestamp по умолчанию возвращает локальное время, что может быть неожиданным. Для UTC используйте datetime.utcfromtimestamp (устарел) или datetime.fromtimestamp(ts, tz=timezone.utc).

Цель: взаимодействие с API, базами данных, логами.

Как работать с микросекундами и наносекундами?

Класс datetime поддерживает микросекунды (6 цифр). Для наносекунд используйте time.time_ns():

from datetime import datetime
import time

now = datetime.now()
print(now.microsecond)   # 123456

ns = time.time_ns()
print(ns)                # 1711726930123456789 нс

Ошибка: при преобразовании наносекунд в datetime теряется точность (округляется до микросекунд).

Цель: высокоточные измерения, метрики.

Расширенные примеры работы с временем

Пример 1: Вычисление возраста человека с учётом високосных лет

Пример
from datetime import datetime, date

def age(birth_date: date) -> int:
    today = date.today()
    years = today.year - birth_date.year
    # проверка, был ли день рождения в этом году
    if (today.month, today.day) < (birth_date.month, birth_date.day):
        years -= 1
    return years

print(age(date(1990, 6, 15)))  # вывод: 34 (на март 2025)
34

Пример 2: Генерация последовательности дат между двумя датами (без выходных)

Пример
from datetime import datetime, timedelta

start = datetime(2025, 3, 1)
end = datetime(2025, 3, 31)
days = []
current = start
while current <= end:
    if current.weekday() < 5:  # пн-пт
        days.append(current)
    current += timedelta(days=1)
print(f'Рабочие дни: {len(days)}')
Рабочие дни: 21

Пример 3: Конвертация строки с неизвестным часовым поясом в другой пояс

Пример
from dateutil import parser, tz

source = '2025-03-29 12:00:00 +05:00'
dt_utc = parser.parse(source).astimezone(tz.UTC)
print(dt_utc)  # 2025-03-29 07:00:00+00:00

# Перевести в московское время
dt_msk = dt_utc.astimezone(tz.gettz('Europe/Moscow'))
print(dt_msk)  # 2025-03-29 10:00:00+03:00
2025-03-29 07:00:00+00:00
2025-03-29 10:00:00+03:00

Пример 4: Использование calendar для отображения месяца с номерами недель

Пример
import calendar

cal = calendar.TextCalendar(firstweekday=0)  # понедельник первый
cal_str = cal.formatmonth(2025, 3)
print(cal_str)
     March 2025
Mo Tu We Th Fr Sa Su
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Пример 5: Подсчёт времени между событиями с микросекундной точностью (с использованием perf_counter_ns)

Пример
import time

def expensive_func():
    for _ in range(10**6):
        pass

start = time.perf_counter_ns()
expensive_func()
end = time.perf_counter_ns()
elapsed_ns = end - start
print(f'Время выполнения: {elapsed_ns / 1e6:.3f} мс')
Время выполнения: 12.345 мс

Пример 6: Работа с duration (интервалами) для форматирования «часы:минуты:секунды»

Пример
from datetime import timedelta

def format_timedelta(td: timedelta) -> str:
    total_seconds = int(td.total_seconds())
    hours, rest = divmod(total_seconds, 3600)
    minutes, seconds = divmod(rest, 60)
    return f'{hours:02d}:{minutes:02d}:{seconds:02d}'

delta = timedelta(hours=27, minutes=15, seconds=8)
print(format_timedelta(delta))  # 27:15:08
27:15:08

Пример 7: Получение списка всех дней определённого месяца с типом дня недели

Пример
from datetime import date, timedelta
import calendar

year, month = 2025, 3
first_day = date(year, month, 1)
if month == 12:
    next_month = date(year+1, 1, 1)
else:
    next_month = date(year, month+1, 1)

current = first_day
while current < next_month:
    day_name = calendar.day_name[current.weekday()]
    print(f'{current.day} {day_name}')
    current += timedelta(days=1)
1 Saturday
2 Sunday
...
31 Monday

Пример 8: Преобразование Unix timestamp в строку с учётом часового пояса

Пример
from datetime import datetime, timezone

unix_ts = 1711726930
dt = datetime.fromtimestamp(unix_ts, tz=timezone.utc)
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z'))  # 2025-03-29 15:42:10 UTC

# Перевести в местное время Каира (UTC+2)
from zoneinfo import ZoneInfo
cairo = dt.astimezone(ZoneInfo('Africa/Cairo'))
print(cairo.strftime('%Y-%m-%d %H:%M:%S %Z'))  # 2025-03-29 17:42:10 EET
2025-03-29 15:42:10 UTC
2025-03-29 17:42:10 EET

Работа с временем в Python 3 - comments

En
Python 3 время (python)