Сообщить об ошибке.

Класс timedelta() модуля datetime в Python

Интервал времени timedelta, поддерживаемые операции

Синтаксис:

import datetime

delta = datetime.timedelta(days=0, 
                           seconds=0, 
                           microseconds=0, 
                           milliseconds=0, 
                           minutes=0, 
                           hours=0, 
                           weeks=0)

Параметры:

Все аргументы являются необязательными и по умолчанию равны 0. Аргументы могут быть целыми числами или числами с плавающей запятой и могут быть положительными или отрицательными.

  • days=0 - день,
  • seconds=0 - секунды,
  • microseconds=0 - микросекунды,
  • milliseconds=0 - миллисекунды,
  • minutes=0 - минуты,
  • hours=0 - часы,
  • weeks=0 - недели.

Возвращаемое значение:

Описание:

Класс timedelta() модуля datetime представляет собой продолжительность, разницу между двумя датами или временем.

Экземпляр datetime.timedelta продолжительность хранит как сочетание days, seconds и microseconds, а остальные переданные в конструктор аргументы конвертируются в эти единицы:

  • millisecond преобразуется в 1000 microseconds.
  • minute преобразуется в 60 seconds.
  • hour преобразуется в 3600 seconds.
  • week преобразуется в 7 days.

days, seconds и microseconds затем нормализуются так, чтобы представление было уникальным:

  • 0 <= microseconds < 1000000
  • 0 <= seconds < 3600*24 (количество секунд в одном дне)
  • -999999999 <= days <= 999999999

В следующем примере показано, как любые аргументы, кроме days, seconds и microseconds объединяются и нормализуются в эти три результирующих атрибута:

>>> from datetime import timedelta
>>> delta = timedelta(
...     days=50,
...     seconds=27,
...     microseconds=10,
...     milliseconds=29000,
...     minutes=5,
...     hours=8,
...     weeks=2
... )

# Остались только дни, секунды и микросекунды
>>> delta
# datetime.timedelta(days=64, seconds=29156, microseconds=10)
>>> delta.days
# 64
>>> delta.seconds
# 29156
>>> delta.microseconds
# 10
>>> delta.total_seconds()
# 5558756.00001

Если какой-либо аргумент представляет собой число float и есть дробные микросекунды и микросекунды, оставшиеся от всех аргументов, то они объединяются, а их сумма округляется до ближайшей микросекунды с использованием прерывателя с округлением от половины до четности. Если аргумент не является float, то процессы преобразования и нормализации являются точными, информация не теряется.

Если нормализованное значение дней находится за пределами диапазона -999999999 <= days <= 999999999, то появляется исключение OverflowError.

Обратите внимание, что нормализация отрицательных значений может сначала удивить. Например:

>>> from datetime import timedelta
>>> d = timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
# (-1, 86399, 999999)

Продолжительность timedelta имеет 1 метод:

delta.total_seconds():

Метод timedelta.total_seconds() возвращает общее количество секунд, содержащихся в продолжительности timedelta. Эквивалент td/timedelta(seconds=1).

Для интервальных единиц, отличных от секунд, используйте форму деления напрямую, например td/timedelta(microseconds=1).

Обратите внимание, что для очень больших временных интервалов более 270 лет на большинстве платформ этот метод теряет микросекундную точность.

Поддерживаемые операции timedelta:

ОперацияРезультатЗамечания
t1 = t2 + t3Сумма t2 и t3. Впоследствии t1-t2 == t3 и t1-t3 == t2 верны.(1)
t1 = t2 - t3Разница t2 и t3. Впоследствии t1 == t2 - t3 и t2 == t1 + t3 верны.(1)(6)
t1 = t2 * i
t1 = i * t2
Дельта умножается на целое число 'int'. Впоследствии t1 // i == t2 верно, если i! = 0.
В общем случае t1 * i == t1 * (i-1) + t1 верно. (1)
t1 = t2 * f
t1 = f * t2
Дельта умножается на 'float'. Результат округляется до ближайшего кратного 'timedelta.resolution' с использованием округления от половины до четности.
f = t2 / t3Деление общей длительности 't2' на интервал 't3'. Возвращает объект 'float'.(3)
t1 = t2 / f
t1 = t2 / i
Дельта делится на 'float' или 'Int'. Результат округляется до ближайшего кратного 'timedelta.resolution' с использованием округления от половины до четности.
t1 = t2 // i
t1 = t2 // t3
Вычисляется, остаток (если есть) выбрасывается. Во втором случае возвращается целое число.(3)
t1 = t2 % t3Остаток вычисляется как объект 'timedelta'.(3)
q, r = divmod(t1, t2)Вычисляет частное и остаток: q = t1 // t2 и r = t1% t2. 'q' представляет собой целое число, а 'r' представляет собой объект 'datetime.timedelta'.(3)
+t1Возвращает объект 'datetime.timedelta' с тем же значением.(2)
-t1Эквивалентно datetime.timedelta(-t1.days, -t1.seconds, -t1.microseconds) и так же t1 * -1.(1) (4)
abs(t)Эквивалентно '+t', когда t.days >= 0, и '-t', когда t.days < 0.(2)
str(t)Возвращает строку в форме [D day [s],] [H] H: MM: SS [.UUUUUU], где D отрицательно для отрицательного 't'. (5)
repr(t)Возвращает строковое представление объекта 'datetime.timedelta' в виде вызова конструктора со значениями канонического атрибута.

Замечания:

  1. Это точно, но может быть переполнение.
  2. Это точно и не может быть переполнения.
  3. Деление на 0 поднимает исключение ZeroDivisionError.
  4. -timedelta.max не может быть представлен как объект datetime.timedelta.
  5. Строковые представления объектов datetime.timedelta нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных timedeltas.Например:

    >>> datetime.timedelta(days=-1, seconds=68400)
    >>> print(_)
    # -1 day, 19:00:00
    
  6. Выражение t2 - t3 всегда будет равно выражению t2 + (-t3), кроме случаев, когда t3 равно timedelta.max. В этом случае первое даст результат, а второе вызовет переполнение.

В дополнение к операциям, перечисленным выше, объекты datetime.timedelta поддерживают определенные дополнения и вычитания с объектами date и datetime. Смотрите "Частые приемы работы c datetime.timedelta".

Поддерживаются сравнения объектов datetime.timedelta с некоторыми оговорками.

Сравнения == или != всегда возвращают bool, независимо от типа сравниваемого объекта:

>>> from datetime import timedelta
>>> delta1 = timedelta(seconds=57)
>>> delta2 = timedelta(hours=25, seconds=2)
>>> delta2 != delta1
# True
>>> delta2 == 5
# False

Для всех других сравнений, таких < как > и когда объект timedelta сравнивается с объектом другого типа, вызывается исключение TypeError:

>>> delta2 > delta1
# True
>>> delta2 > 5
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int'

В булевых контекстах объект timedelta считается истинным тогда и только тогда, когда он не равен datetime.timedelta(0).

Дополнительный пример нормализации:

>>> # Components of another_year add up to exactly 365 days
>>> from datetime import timedelta
>>> year = timedelta(days=365)

# Компоненты 'another_year' составляют ровно 365 дней
>>> another_year = timedelta(weeks=40, days=84, hours=23,
...                          minutes=50, seconds=600)
>>> year == another_year
# True
>>> year.total_seconds()
# 31536000.0