Вычитание более позднего времени из первого difference = later_time - first_time создает объект datetime, который содержит только разницу. В приведенном выше примере это 0 минут, 8 секунд и 562000 микросекунд.
Ответ 2
Используя пример datetime
>>> from datetime import datetime >>> then = datetime(2012, 3, 5, 23, 8, 15) # Random date in the past >>> now = datetime.now() # Now >>> duration = now - then # For build-in functions >>> duration_in_s = duration.total_seconds() # Total number of seconds between dates
Длительность в годах
>>> years = divmod(duration_in_s, 31536000)[0] # Seconds in a year=365*24*60*60 = 31536000.
Длительность в днях
>>> days = duration.days # Build-in datetime function >>> days = divmod(duration_in_s, 86400)[0] # Seconds in a day = 86400
Длительность в часах
>>> hours = divmod(duration_in_s, 3600)[0] # Seconds in an hour = 3600
Длительность в минутах
>>> minutes = divmod(duration_in_s, 60)[0] # Seconds in a minute = 60
Длительность в секундах
[!] Смотрите предупреждение об использовании длительности в секундах в нижней части этого поста
[!] Смотрите предупреждение об использовании длительности в микросекундах в нижней части этого поста
>>> microseconds = duration.microseconds # Build-in datetime function
Общая продолжительность между двумя датами
>>> days = divmod(duration_in_s, 86400) # Get days (without [0]!) >>> hours = divmod(days[1], 3600) # Use remainder of days to calc hours >>> minutes = divmod(hours[1], 60) # Use remainder of hours to calc minutes >>> seconds = divmod(minutes[1], 1) # Use remainder of minutes to calc seconds >>> print("Time between dates: %d days, %d hours, %d minutes and %d seconds" % (days[0], hours[0], minutes[0], seconds[0]))
или просто:
>>> print(now - then)
Редактировать 2019 Поскольку этот ответ набрал популярность, я добавлю функцию, которая может упростить использование для некоторых
from datetime import datetime
defgetDuration(then, now = datetime.now(), interval = "default"):
# Returns a duration as specified by variable interval # Functions, except totalDuration, returns [quotient, remainder]
duration = now - then # For build-in functions duration_in_s = duration.total_seconds()
defyears(): returndivmod(duration_in_s, 31536000) # Seconds in a year=31536000.
defdays(seconds = None): returndivmod(seconds if seconds != Noneelse duration_in_s, 86400) # Seconds in a day = 86400
defhours(seconds = None): returndivmod(seconds if seconds != Noneelse duration_in_s, 3600) # Seconds in an hour = 3600
defminutes(seconds = None): returndivmod(seconds if seconds != Noneelse duration_in_s, 60) # Seconds in a minute = 60
# Example usage then = datetime(2012, 3, 5, 23, 8, 15) now = datetime.now()
print(getDuration(then)) # E.g. Time between dates: 7 years, 208 days, 21 hours, 19 minutes and 15 seconds print(getDuration(then, now, 'years')) # Prints duration in years print(getDuration(then, now, 'days')) # days print(getDuration(then, now, 'hours')) # hours print(getDuration(then, now, 'minutes')) # minutes print(getDuration(then, now, 'seconds')) # seconds
Предупреждение: Обратите внимание на встроенные значения .seconds и .microseconds
datetime.seconds и datetime.microseconds ограничены значениями [0,86400) и [0,10 ^ 6) соответственно.
Их следует использовать осторожно, если значение timedelta больше максимального возвращаемого значения.
Примеры:
end проходит 1 час и 200 мкс после start:
>>> start = datetime(2020,12,31,22,0,0,500) >>> end = datetime(2020,12,31,23,0,0,700) >>> delta = end - start >>> delta.microseconds RESULT: 200 EXPECTED: 3600000200
end через 1d и 1hstart:
>>> start = datetime(2020,12,30,22,0,0) >>> end = datetime(2020,12,31,23,0,0) >>> delta = end - start >>> delta.seconds RESULT: 3600 EXPECTED: 90000
Ответ 3
Новым в Python 2.7 является timedelta метод экземпляра .total_seconds(). Из документации Python это эквивалентно (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6.