Типы данных для представления времени в Python

Раздел: Прочее -> Типы данных

Основные типы данных для времени в Python

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

Модуль datetime предоставляет классы datetime, date, time, timedelta и timezone. Это основной и наиболее гибкий инструмент для работы с датами и временем в Python.

from datetime import datetime, date, time, timedelta, timezone

# Создание текущего момента
t = datetime.now()
print(t)  # 2025-03-28 14:30:00.123456

# Создание даты
d = date(2025, 3, 28)
print(d)  # 2025-03-28

# Создание времени
tm = time(14, 30, 0)
print(tm)  # 14:30:00

# Продвинутое создание с часовым поясом
tz = timezone.utc
dt_utc = datetime(2025, 3, 28, 14, 30, tzinfo=tz)
print(dt_utc)  # 2025-03-28 14:30:00+00:00

вещественные значения python (вещественные значения в python)

Возможные проблемы:

  • Объекты datetime без часового пояса считаются «наивными» и могут привести к ошибкам при сравнении с «осведомлёнными».
  • Метод datetime.now() использует локальное время без указания часового пояса. Для UTC следует применять datetime.now(timezone.utc).
  • Арифметика с timedelta не учитывает переход на летнее время. Для этого нужны сторонние библиотеки (pytz или zoneinfo).

Вариант: использование модуля time для работы с Unix-временем

Модуль time оперирует числами с плавающей точкой – секундами от 1 января 1970 года. Это удобно для быстрых замеров и лёгкого обмена данными.

import time

# Текущий timestamp
ts = time.time()
print(ts)  # 1743165000.1234567

# Преобразование в struct_time
st = time.gmtime(ts)
print(st)  # time.struct_time(tm_year=2025, tm_mon=3, tm_day=28, ...)

вывести тип данных python (вывод типа данных в python)

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

Альтернатива: модуль calendar для календарных вычислений

calendar помогает получать дни недели, количество дней в месяце, определять високосные годы. Он не работает с миллисекундами, но полезен для бизнес-логики.

import calendar

# Проверка високосного года
print(calendar.isleap(2024))  # True

# Количество дней в феврале 2024
print(calendar.monthrange(2024, 2))  # (3, 29) – (первый день недели, число дней)

Python двоичные данные (работа с двоичными данными в python)

Сторонние библиотеки: pendulum и arrow

Для сложных операций с часовыми поясами и летним временем удобно использовать pendulum или arrow. Они предлагают более лаконичный API, чем стандартный datetime.

import pendulum

now = pendulum.now('Europe/Moscow')
print(now)  # 2025-03-28T17:30:00+03:00
print(now.diff_days())  # разница с сегодня

import arrow

utc = arrow.utcnow()
local = utc.to('Europe/Moscow')
print(local.format('YYYY-MM-DD HH:mm'))  # 2025-03-28 17:30

Использование внешних библиотек увеличивает размер проекта и требует установки. Для базовых задач стандартного datetime достаточно.

Цель каждой библиотеки – предоставить разработчику инструмент, соответствующий конкретной задаче: точное время (datetime), быстрые замеры (time), календарные расчёты (calendar) или продвинутая работа с поясами (pendulum).

- логические значения python (логические значения в python)
- длина переменной python (длина числа и переменной в python)
- определение объекта python (определение типа объекта в python)

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

Пример 1: Работа с часовыми поясами через zoneinfo (Python 3.9+)

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

# Создание даты с явным указанием часового пояса
dt = datetime(2025, 3, 28, 14, 30, tzinfo=ZoneInfo("Europe/Moscow"))
print(dt)  # 2025-03-28 14:30:00+03:00

# Перевод в другой пояс
new_york = dt.astimezone(ZoneInfo("America/New_York"))
print(new_york)  # 2025-03-28 06:30:00-05:00 (с учётом летнего времени)
2025-03-28 14:30:00+03:00
2025-03-28 06:30:00-05:00

Пример 2: Вычисление длительности с учётом бизнес-дней

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

start = datetime(2025, 3, 24)  # понедельник
end = datetime(2025, 3, 28)    # пятница
current = start
business_days = 0
while current <= end:
    if current.weekday() < 5:  # 0-4 = пн-пт
        business_days += 1
    current += timedelta(days=1)
print(f"Будних дней между {start.date()} и {end.date()}: {business_days}")
Будних дней между 2025-03-24 и 2025-03-28: 5

Пример 3: Форматирование и парсинг строк с помощью strftime/strptime

Пример
from datetime import datetime

# Парсинг строки
date_str = "2025-03-28 14:30:00"
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(dt)  # 2025-03-28 14:30:00

# Обратное форматирование
formatted = dt.strftime("%d %B %Y, %I:%M %p")
print(formatted)  # 28 March 2025, 02:30 PM
2025-03-28 14:30:00
28 March 2025, 02:30 PM

Пример 4: Работа с Unix-временем и высокая точность

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

# Получение timestamp с микросекундами
ts = time.time_ns() / 1e9  # наносекунды -> секунды
print("Высокая точность:", ts)

# Конвертация обратно в datetime
dt = datetime.fromtimestamp(ts, tz=timezone.utc)
print("UTC время:", dt)

# Использование timedelta для точных расчётов
delta = timedelta(seconds=ts % 3600)
remaining = timedelta(hours=1) - delta
print(f"До конца часа осталось: {remaining.seconds} секунд")
Высокая точность: 1743165000.1234568
UTC время: 2025-03-28 14:30:00.123456+00:00
До конца часа осталось: 0 секунд

Пример 5: Определение дня недели и номера недели по ISO

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

dt = datetime(2025, 3, 31, tzinfo=timezone.utc)  # понедельник
print("День недели:", dt.strftime("%A"))         # Monday
print("Номер недели в году:", dt.isocalendar()[1])  # 14 (по ISO)
print("Порядковый номер года:", dt.timetuple().tm_yday)  # 90
День недели: Monday
Номер недели в году: 14
Порядковый номер года: 90

Пример 6: Сериализация datetime в JSON

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

def datetime_serializer(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    raise TypeError("Type not serializable")

dt = datetime.now(timezone.utc)
data = {"time": dt}
json_str = json.dumps(data, default=datetime_serializer)
print(json_str)  # {"time": "2025-03-28T14:30:00.123456+00:00"}
{"time": "2025-03-28T14:30:00.123456+00:00"}

Типы данных для времени в Python - comments

En
Python типы данных время (python)