Работа с датой и временем — это как будто кто-то специально хотел нас запутать: часовые пояса, переходы на летнее время, таймзоны с получасовыми сдвигами и «настоящий ISO 8601». Но Python, как всегда, даёт в руки мощные инструменты — главное знать, как ими не выстрелить себе в ногу.
В этой статье:
- Объясняем всё с нуля
- Разбираем реальные задачи
- Комментируем каждую строчку
- Используем datetime, pytz, zoneinfo, dateutil
🔧 Пример 1: Получаем текущую дату и время
from datetime import datetime
now = datetime.now()
print(now)
🧠 datetime.now() — даёт текущую локальную дату и время. Это не всегда хорошо — лучше явно указывать таймзону, особенно на сервере.
🌍 Пример 2: Работа с часовыми поясами (pytz)
from datetime import datetime
import pytz
tz = pytz.timezone("Europe/Moscow")
now = datetime.now(tz)
print(now)
📌 pytz — проверенный временем способ работать с таймзонами.
🧪 Пример 3: Парсинг строк в дату (dateutil)
Установим:
pip install python-dateutil
Теперь парсим дату:
from dateutil import parser
dt = parser.parse("2025-04-23 14:30")
print(dt)
📦 dateutil.parser — супер-гибкий. Понимает и "April 23, 2025", и "23.04.25".
📆 Пример 4: Форматирование даты под пользователя
from datetime import datetime
dt = datetime(2025, 4, 23, 14, 30)
# Превращаем в строку
formatted = dt.strftime("%d.%m.%Y %H:%M")
print(formatted)
🗓️ %d, %m, %Y, %H, %M — это как магия в Excel, но на Python.
🔁 Пример 5: Перевод даты между часовыми поясами
from datetime import datetime
import pytz
utc = pytz.utc
moscow = pytz.timezone("Europe/Moscow")
# Создаем объект в UTC
dt = utc.localize(datetime.utcnow())
print("UTC:", dt)
# Переводим в Москву
dt_moscow = dt.astimezone(moscow)
print("Moscow:", dt_moscow)
🔥 Частая ошибка: "naive" и "aware" объекты. pytz.localize() превращает "наивную" дату в "осознанную", с таймзоной.
🕳️ Пример 6: Альтернатива pytz — zoneinfo (Python 3.9+)
from datetime import datetime
from zoneinfo import ZoneInfo
dt = datetime.now(ZoneInfo("Asia/Tokyo"))
print(dt)
🆕 zoneinfo встроен в Python с версии 3.9. Не нужен pytz, и синтаксис проще.
⏳ Пример 7: Разница между датами
from datetime import datetime, timedelta
start = datetime(2025, 4, 23, 14, 30)
end = datetime(2025, 5, 1, 10, 0)
delta = end - start
print("Дней:", delta.days)
print("Часов:", delta.total_seconds() // 3600)
📊 Полезно при расчётах дедлайнов, аренды, подписок и прочей жизненной боли.
🧨 Пример 8: UTC everywhere, локально — по запросу
from datetime import datetime
import pytz
def get_user_time(utc_dt, tz_str):
user_tz = pytz.timezone(tz_str)
return utc_dt.astimezone(user_tz)
utc_now = pytz.utc.localize(datetime.utcnow())
print(get_user_time(utc_now, "Asia/Bangkok"))
print(get_user_time(utc_now, "America/New_York"))
⚙️ Хранить всё в UTC, а показывать пользователю с учётом его таймзоны — best practice в веб-приложениях.
🧠 Напоследок: полезные шаблоны форматирования
Теперь давай развернём три реальные мини-проекта с использованием datetime — от базового до полезного в продакшене. Всё с подробными комментариями, как всегда:
📅 1. Календарь событий (простая CLI-версия)
from datetime import datetime
events = [
{"title": "Собеседование", "date": "2025-04-25 14:00"},
{"title": "Презентация", "date": "2025-04-26 10:30"},
]
# Преобразуем строки в datetime-объекты
for event in events:
event["date"] = datetime.strptime(event["date"], "%Y-%m-%d %H:%M")
# Показываем только будущие события
now = datetime.now()
print("Ближайшие события:")
for e in sorted(events, key=lambda x: x["date"]):
if e["date"] > now:
print(f"{e['date'].strftime('%d.%m.%Y %H:%M')} — {e['title']}")
📌 Можно добавить сохранение в файл или интеграцию с ics (формат календарей).
📋 2. Генератор расписания на неделю
from datetime import datetime, timedelta
def generate_schedule(start_date_str, interval_days=1, count=5):
start = datetime.strptime(start_date_str, "%Y-%m-%d")
for i in range(count):
date = start + timedelta(days=i * interval_days)
print(f"{date.strftime('%A, %d.%m.%Y')} — Занятие {i+1}")
generate_schedule("2025-04-23", interval_days=2, count=5)
📚 Полезно для учебных планов, тренировок, напоминаний.
🤖 3. Уведомления в Telegram по таймеру
Для этого тебе нужен бот с токеном от @BotFather. Установи библиотеку:
pip install python-telegram-bot
Мини-бот с уведомлением через asyncio
import asyncio
from datetime import datetime, timedelta
from telegram import Bot
TOKEN = "YOUR_BOT_TOKEN"
CHAT_ID = "YOUR_CHAT_ID" # Можно получить, отправив сообщение боту и проверив через лог
bot = Bot(TOKEN)
async def send_reminder(text, delay_sec):
await asyncio.sleep(delay_sec)
await bot.send_message(chat_id=CHAT_ID, text=text)
# Уведомление через 10 секунд
asyncio.run(send_reminder("🕐 Напоминание: пора делать дело!", 10))
💡 Можно расписать напоминания на целый день или неделю, используя datetime + timedelta.
💡 Идеи для прокачки:
- Web-интерфейс на Flask с календарём событий
- Поддержка Google Calendar API
- Телеграм-бот с добавлением/удалением событий
- Хранилище событий в SQLite или JSON