Временные данные в Python: time, datetime, timedelta, zoneinfo

Раздел: Стандартная библиотека Python -> Работа с датой и временем

Основные операции со временем

Как получить текущее время в Python?

Для получения текущего момента времени существует несколько инструментов. time.time() возвращает число секунд с эпохи (Unix timestamp). datetime.datetime.now() возвращает объект datetime с локальным временем. Также доступен datetime.datetime.utcnow() для UTC времени.

Основным решением является использование datetime.datetime.now() с явным указанием часового пояса через datetime.timezone.utc или после получения - перевод в осознанный объект. Это обеспечивает удобство форматирования и арифметических операций.


from datetime import datetime, timezone

now_utc = datetime.now(timezone.utc)
print(now_utc)

Python вывести время (вывод текущего времени в python)

2025-03-21 15:30:00.123456+00:00

Python вывести год (вывод текущего года в python)

Типичная ошибка - использование неосознанного (naive) datetime без указания часового пояса. Это может привести к неверным результатам при сравнении с временем из другого пояса. Решение: всегда переводить объекты в aware с помощью replace(tzinfo=...) или использовать pytz.

Как преобразовать timestamp в читаемую строку?

Самый простой способ - time.ctime(), который возвращает строку фиксированного формата. Другой вариант - time.strftime(format, localtime), дающий контроль над форматом.

Наиболее гибкое решение - метод datetime.fromtimestamp(timestamp).strftime(format). Он позволяет задать любой формат в соответствии с кодами форматирования (например, %Y-%m-%d %H:%M:%S).


from datetime import datetime

ts = 1710000000
dt_obj = datetime.fromtimestamp(ts)
formatted = dt_obj.strftime('%d.%m.%Y %H:%M:%S')
print(formatted)

Python date day (компоненты даты)

09.03.2024 10:00:00

Python datetime date (модуль datetime)

Ошибка: неверный порядок кодов форматирования (например, %S вместо %M). Также следует учитывать локальные настройки: если требуется английское название месяца, лучше использовать locale или явно задать английский язык.

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

Функция time.strptime(string, format) возвращает struct_time. А datetime.datetime.strptime(string, format) создаёт объект datetime.

Используйте datetime.strptime, так как результат сохраняет все поля даты и времени и легко преобразуется в другие форматы.


from datetime import datetime

date_str = '21.03.2025 15:30'
dt = datetime.strptime(date_str, '%d.%m.%Y %H:%M')
print(dt)

Python string to date (преобразование строки в дату)

2025-03-21 15:30:00

Python тип время (тип время (datetime) в python)

Ошибка ValueError возникает, если строка не соответствует шаблону. Рекомендуется сначала проверять формат с помощью try-except. Также возможна путаница с месяцем и днем (европейский vs американский формат).

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

Варианты: time.time() - системные часы, time.perf_counter() - высокоточный таймер, модуль timeit для точных замеров небольших участков.

Для большинства случаев применяется time.perf_counter(), так как он использует монотонный счётчик с высокой точностью и не подвержен изменению системного времени.


import time

start = time.perf_counter()
# ... какой-то код ...
end = time.perf_counter()
print(f'Время выполнения: {end - start:.6f} секунд')

Time data python (работа с временными данными (time) в python)

Время выполнения: 0.002345 секунд

Python вывести дату (вывести дату в python)

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

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

Встроенные средства: datetime.timezone для простых смещений, сторонняя библиотека pytz (or zoneinfo в Python 3.9+). Также атрибут time.timezone даёт смещение локального пояса.

Рекомендуется использовать zoneinfo (Python 3.9+) или pytz для работы с полными базами данных часовых поясов и учётом летнего времени.


from datetime import datetime
from zoneinfo import ZoneInfo

dt_ny = datetime.now(ZoneInfo('America/New_York'))
print(dt_ny)
dt_utc = dt_ny.astimezone(ZoneInfo('UTC'))
print(dt_utc)

Python разница времени (вычисление разницы между датами и временем в python)

2025-03-21 11:30:00-04:00
2025-03-21 15:30:00+00:00

Python текущая дата и время (получение текущей даты и времени в python)

Ошибки: неверное представление летнего времени (DST) при ручном вычислении смещения. Использование pytz требует вызова localize() вместо replace() для корректного перехода на летнее время. В zoneinfo эта проблема отсутствует.

Как производить арифметику с датами?

Основной инструмент - datetime.timedelta. Библиотека dateutil предлагает более сложные операции (relativedelta).

Для прибавления/вычитания дней, секунд, микросекунд используйте timedelta в паре с datetime. Это встроенное решение покрывает большинство задач.


from datetime import datetime, timedelta

now = datetime.now()
tomorrow = now + timedelta(days=1)
print('Завтра:', tomorrow)
next_month = now.replace(month=now.month + 1) if now.month < 12 else now.replace(year=now.year+1, month=1)
print('Следующий месяц (примерно):', next_month)
Завтра: 2025-03-22 15:30:00.123456
Следующий месяц (примерно): 2025-04-21 15:30:00

Ошибка: при добавлении месяца через replace может возникнуть ValueError, если день месяца больше числа дней в новом месяце (например, 31 января + 1 месяц → февраль с 31 днём). Решение: использовать dateutil.relativedelta или предварительно округлять до последнего дня месяца.

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

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

Для однократной задержки с возможностью отмены используйте threading.Timer. Он запускает функцию через заданное время в отдельном потоке, не блокируя основной.


import threading

def hello():
    print('Прошло 2 секунды')

timer = threading.Timer(2.0, hello)
timer.start()
print('Таймер запущен')
Таймер запущен
(через 2 секунды) Прошло 2 секунды

Ошибка: threading.Timer не точен из-за GIL и загрузки системы. Для высокоточных задержек (реального времени) потребуется специализированное оборудование или операционная система реального времени.

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

Парсинг и форматирование в стандарте ISO 8601

Формат ISO 8601 широко используется для обмена данными. В Python можно использовать метод datetime.fromisoformat() (Python 3.7+) и isoformat().

Пример

from datetime import datetime, timezone

# Создание строки ISO 8601
dt = datetime.now(timezone.utc)
iso_str = dt.isoformat()
print(iso_str)

# Парсинг строки ISO 8601
date_str = '2025-03-21T15:30:00+00:00'
parsed_dt = datetime.fromisoformat(date_str)
print(parsed_dt)
2025-03-21T15:30:00.123456+00:00
2025-03-21 15:30:00+00:00

Вычисление возраста по дате рождения

Используем timedelta и учёт года.

Пример

from datetime import datetime

birth = datetime(1990, 6, 15)
today = datetime.now()
age = today.year - birth.year - ((today.month, today.day) < (birth.month, birth.day))
print('Возраст:', age)
Возраст: 34

Число дней между двумя датами

Пример

from datetime import datetime

d1 = datetime(2025, 1, 1)
d2 = datetime(2025, 12, 31)
delta = d2 - d1
print('Дней между датами:', delta.days)
Дней между датами: 364

Работа с микросекундами и наносекундами

Объект datetime хранит микросекунды (до 6 знаков). Для наносекунд можно использовать datetime.time с дополнительными вычислениями.

Пример

from datetime import datetime, timedelta

now = datetime.now()
micro = now.microsecond
# Имитация наносекунд (например, из time.perf_counter)
nano = int((time.perf_counter_ns() - time.perf_counter_ns()) // 1000)
print('Микросекунды:', micro)
print('Наносекунды (условно):', nano)
Микросекунды: 123456
Наносекунды (условно): 789000

Использование модуля calendar для работы с неделями и месяцами

Пример

import calendar

# Определить первый день месяца и количество дней
print(calendar.monthrange(2025, 3))
# Вывод: (5, 31) - понедельник (0=пн) и 31 день

# Проверить, является ли год високосным
print(calendar.isleap(2024))
# Вывод: True
(5, 31)
True

Парсинг даты в формате RFC 2822 (email)

Для парсинга таких строк удобен модуль email.utils.

Пример

from email.utils import parsedate_to_datetime

date_str = 'Mon, 21 Mar 2025 15:30:00 +0000'
dt = parsedate_to_datetime(date_str)
print(dt)
2025-03-21 15:30:00+00:00

Работа с таймзонами через pytz (альтернатива zoneinfo)

Пример

import pytz
from datetime import datetime

moscow = pytz.timezone('Europe/Moscow')
dt_moscow = datetime.now(moscow)
print(dt_moscow)
# Перевод в другой пояс
dt_ny = dt_moscow.astimezone(pytz.timezone('America/New_York'))
print(dt_ny)
2025-03-21 18:30:00+03:00
2025-03-21 11:30:00-04:00

Создание повторяющегося таймера с использованием threading

Пример

import threading

def repeat_timer(interval, func):
    def wrapper():
        func()
        threading.Timer(interval, wrapper).start()
    threading.Timer(interval, wrapper).start()

def task():
    print('Задача выполнена', datetime.now())

repeat_timer(3, task)
# Остановка осуществляется через отмену внутреннего таймера

Работа с временными данными (time) в Python - comments

En
Time data python (python)