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
затем нормализуются так, чтобы представление было уникальным:
microseconds
< 1000000seconds
< 3600*24 (количество секунд в одном дне)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' в виде вызова конструктора со значениями канонического атрибута. |
Замечания:
ZeroDivisionError
.-timedelta.max
не может быть представлен как объект datetime.timedelta
.Строковые представления объектов datetime.timedelta
нормализуются аналогично их внутреннему представлению. Это приводит к несколько необычным результатам для отрицательных timedeltas
.Например:
>>> datetime.timedelta(days=-1, seconds=68400) >>> print(_) # -1 day, 19:00:00
Выражение 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