Datetime.timedelta: примеры (PYTHON)

Использование timedelta для обработки временных отрезков
Раздел: Дата и время, Интервалы
datetime.timedelta(days: int=0, seconds: int=0, microseconds: int=0, milliseconds: int=0, minutes: int=0, hours: int=0, weeks: int=0): datetime.timedelta

Функция timedelta в Python

Класс datetime.timedelta в модуле datetime используется для представления длительности временного интервала - разницы между двумя датами или времени. Экземпляры этого класса являются неизменяемыми и позволяют выполнять арифметические операции с объектами datetime и date.

Применение timedelta включает расчет дат в будущем или прошлом, измерение интервалов, планирование задач и обработку временных отрезков в приложениях.

Конструктор класса принимает следующие аргументы:

  • days (дни) - целое число или число с плавающей запятой, по умолчанию 0.
  • seconds (секунды) - целое число или число с плавающей запятой, по умолчанию 0.
  • microseconds (микросекунды) - целое число или число с плавающей запятой, по умолчанию 0.
  • milliseconds (миллисекунды) - целое число или число с плавающей запятой, по умолчанию 0.
  • minutes (минуты) - целое число или число с плавающей запятой, по умолчанию 0.
  • hours (часы) - целое число или число с плавающей запятой, по умолчанию 0.
  • weeks (недели) - целое число или число с плавающей запятой, по умолчанию 0.

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

Экземпляр timedelta имеет три доступных для чтения атрибута: days, seconds и microseconds. Метод total_seconds() возвращает общую длительность интервала в секундах как число с плавающей запятой.

Основные примеры применения timedelta

Создание временного интервала разными способами:

from datetime import timedelta

# Простой интервал в 10 дней
delta1 = timedelta(days=10)
print(delta1)

# Интервал с использованием нескольких параметров
delta2 = timedelta(days=5, hours=12, minutes=30)
print(delta2)

# Отрицательный интервал
delta3 = timedelta(days=-2, hours=-6)
print(delta3)

# Интервал с плавающей запятой
delta4 = timedelta(days=2.5, hours=3.75)
print(delta4)
10 days, 0:00:00
5 days, 12:30:00
-3 days, 18:00:00
3 days, 6:45:00

Арифметические операции с датами:

from datetime import datetime

today = datetime(2024, 1, 15)
interval = timedelta(days=7)

future_date = today + interval
print(future_date)

past_date = today - interval
print(past_date)
2024-01-22 00:00:00
2024-01-08 00:00:00

Работа с атрибутами timedelta:

delta = timedelta(days=2, hours=5, minutes=15, seconds=30, microseconds=500)
print(f'days: {delta.days}')
print(f'seconds: {delta.seconds}')
print(f'microseconds: {delta.microseconds}')
print(f'total_seconds: {delta.total_seconds()}')
days: 2
seconds: 18930
microseconds: 500
total_seconds: 189030.0005

Похожие средства для работы со временем в Python

В стандартной библиотеке Python существуют другие инструменты для обработки временных интервалов.

dateutil.relativedelta из библиотеки dateutil предоставляет более гибкие возможности для работы с относительными интервалами, включая месяцы и годы, которые не поддерживаются timedelta. Эта функция полезна для операций с календарными месяцами.

datetime.timezone используется для работы с часовыми поясами, тогда как timedelta применяется для смещений UTC. Эти классы часто используются вместе.

time.perf_counter и time.monotonic измеряют временные интервалы с высокой точностью для профилирования, но не предназначены для календарных вычислений.

При выборе между timedelta и другими средствами рассматривают задачу: для простых арифметических операций с датами достаточно timedelta, для сложных календарных вычислений выбирают dateutil.relativedelta.

Распространенные ошибки при работе с timedelta

Применение timedelta иногда приводит к типичным ошибкам, которые можно избежать.

Попытка создать интервал с некорректными типами аргументов вызывает исключение TypeError.

from datetime import timedelta

try:
    delta = timedelta(days="два")
except TypeError as e:
    print(f'Ошибка: {e}')
Ошибка: 'str' object cannot be interpreted as an integer

Сложение интервалов с несовместимыми типами данных приводит к ошибке.

from datetime import timedelta

try:
    result = timedelta(days=1) + "текст"
except TypeError as e:
    print(f'Ошибка: {e}')
Ошибка: unsupported operand type(s) for +: 'datetime.timedelta' and 'str'

Переполнение атрибутов days, seconds и microseconds может вызвать неожиданное поведение, так как seconds всегда находится в диапазоне от 0 до 86399.

from datetime import timedelta

delta = timedelta(days=1, seconds=100000)
print(f'days: {delta.days}, seconds: {delta.seconds}')
days: 2, seconds: 13600

Округление при использовании чисел с плавающей запятой иногда приводит к потере точности.

from datetime import timedelta

delta = timedelta(days=1.7)
print(delta)
print(delta.total_seconds())
1 day, 16:48:00
146880.0

Изменения в поведении timedelta

В последних версиях Python класс timedelta не претерпел существенных изменений в своей основной функциональности.

Начиная с Python 3.2, метод total_seconds() возвращает значение с плавающей запятой, что позволяет получить более точный результат для интервалов с микросекундами.

В Python 3.7 добавлена возможность использования объектов timedelta в качестве ключей словаря, если они хешируемы.

Поддержка параметра weeks была добавлена в ранних версиях и остается стабильной.

Совместимость с другими типами данных, такими как int и float, улучшалась в различных версиях для повышения точности преобразований.

Расширенные примеры применения timedelta

Класс timedelta применяется в различных сложных сценариях работы с временными данными.

Вычисление возраста с точностью до дней:

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

birth_date = datetime(1990, 5, 20)
today = datetime(2024, 1, 15)
age = today - birth_date
print(f'Возраст в днях: {age.days}')
print(f'Возраст в годах (приблизительно): {age.days // 365}')
Возраст в днях: 12312
Возраст в годах (приблизительно): 33

Создание последовательности дат с определенным интервалом:

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

start_date = datetime(2024, 1, 1)
dates = [start_date + timedelta(days=i) for i in range(0, 30, 3)]
for date in dates:
    print(date.strftime('%Y-%m-%d'))
2024-01-01
2024-01-04
2024-01-07
2024-01-10
2024-01-13
2024-01-16
2024-01-19
2024-01-22
2024-01-25
2024-01-28

Работа с интервалами в бизнес-логике, например расчет даты доставки с учетом рабочих дней:

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

def add_working_days(start_date, days):
    current_date = start_date
    added_days = 0
    while added_days < days:
        current_date += timedelta(days=1)
        if current_date.weekday() < 5:  # Понедельник-пятница
            added_days += 1
    return current_date

order_date = datetime(2024, 1, 15)  # Понедельник
delivery_date = add_working_days(order_date, 5)
print(f'Дата доставки: {delivery_date.strftime("%Y-%m-%d")}')
Дата доставки: 2024-01-22

Использование timedelta для измерения времени выполнения кода:

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

start = datetime.now()
time.sleep(2.5)  # Имитация длительной операции
end = datetime.now()

execution_time = end - start
print(f'Время выполнения: {execution_time}')
print(f'Время выполнения в секундах: {execution_time.total_seconds():.2f}')
Время выполнения: 0:00:02.500123
Время выполнения в секундах: 2.50

Нормализация интервала, когда необходимо представить его в стандартном виде:

Пример python
from datetime import timedelta

def normalize_timedelta(td):
    total_seconds = int(td.total_seconds())
    days, remainder = divmod(total_seconds, 86400)
    hours, remainder = divmod(remainder, 3600)
    minutes, seconds = divmod(remainder, 60)
    return f'{days} дней, {hours} часов, {minutes} минут, {seconds} секунд'

delta = timedelta(days=1.75, hours=5.5)
print(normalize_timedelta(delta))
1 дней, 23 часов, 0 минут, 0 секунд

Применение в условиях сравнения для проверки временных ограничений:

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

user_last_active = datetime(2024, 1, 14, 15, 30, 0)
current_time = datetime(2024, 1, 15, 10, 0, 0)
inactivity_threshold = timedelta(hours=24)

if current_time - user_last_active > inactivity_threshold:
    print('Пользователь неактивен более суток')
else:
    print('Пользователь был активен недавно')
Пользователь был активен недавно

Аналоги timedelta в других языках

В других языках программирования существуют аналогичные средства для работы с временными интервалами.

PHP: Класс DateInterval используется для представления интервалов.

$interval = new DateInterval('P10D');
echo $interval->format('%d days');

$date = new DateTime('2024-01-15');
$date->add($interval);
echo $date->format('Y-m-d');
10 days
2024-01-25

JavaScript: Временные интервалы обычно представляются в миллисекундах, но библиотеки типа Moment.js или Temporal API предоставляют аналогичные объекты.

// Использование временной метки в миллисекундах
const date = new Date('2024-01-15');
const newDate = new Date(date.getTime() + 10 * 24 * 60 * 60 * 1000);
console.log(newDate.toISOString().split('T')[0]);
2024-01-25

Java: Класс Duration из java.time для представления интервалов.

import java.time.Duration;
import java.time.LocalDateTime;

Duration duration = Duration.ofDays(10);
LocalDateTime date = LocalDateTime.of(2024, 1, 15, 0, 0);
LocalDateTime newDate = date.plus(duration);
System.out.println(newDate);
2024-01-25T00:00

SQL: В SQL интервалы представлены в виде INTERVAL, синтаксис зависит от СУБД.

-- PostgreSQL
SELECT CURRENT_DATE + INTERVAL '10 days' AS future_date;
2024-01-25

C#: Структура TimeSpan для представления интервалов времени.

TimeSpan interval = new TimeSpan(10, 0, 0, 0);
DateTime date = new DateTime(2024, 1, 15);
DateTime newDate = date.Add(interval);
Console.WriteLine(newDate.ToString("yyyy-MM-dd"));
2024-01-25

Go: В Go нет специального типа, используют time.Duration для представления интервалов в наносекундах.

package main

import (
    "fmt"
    "time"
)

func main() {
    date := time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC)
    newDate := date.Add(10 * 24 * time.Hour)
    fmt.Println(newDate.Format("2006-01-02"))
}
2024-01-25

Основные отличия от Python включают единицы измерения, поддержку месяцев и годов, а также точность представления интервалов.

питон datetime.timedelta function comments

En
Datetime.timedelta Represent a duration