Найти в Дзене
Анастасия Софт

🕰️ datetime Python: парсим, форматируем и не путаем часовые пояса

Работа с датой и временем — это как будто кто-то специально хотел нас запутать: часовые пояса, переходы на летнее время, таймзоны с получасовыми сдвигами и «настоящий ISO 8601». Но Python, как всегда, даёт в руки мощные инструменты — главное знать, как ими не выстрелить себе в ногу. В этой статье: from datetime import datetime
now = datetime.now()
print(now) 🧠 datetime.now() — даёт текущую локальную дату и время. Это не всегда хорошо — лучше явно указывать таймзону, особенно на сервере. from datetime import datetime
import pytz
tz = pytz.timezone("Europe/Moscow")
now = datetime.now(tz)
print(now) 📌 pytz — проверенный временем способ работать с таймзонами. Установим: 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". from datetime import datetime
dt = datetime(2025, 4, 23, 14, 30)
# Превращаем в строку
formatted = dt.strftime("%d.%
Оглавление

Работа с датой и временем — это как будто кто-то специально хотел нас запутать: часовые пояса, переходы на летнее время, таймзоны с получасовыми сдвигами и «настоящий 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
datetime Python: парсим, форматируем и не путаем часовые пояса
datetime Python: парсим, форматируем и не путаем часовые пояса