Дата и время в Python 3: полный обзор возможностей и практические примеры
Работа с временем в 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:00Python реальное время (получение реального времени в 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