Skip to content

Instantly share code, notes, and snippets.

@mwhooker
Created June 3, 2012 10:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mwhooker/2862955 to your computer and use it in GitHub Desktop.
Save mwhooker/2862955 to your computer and use it in GitHub Desktop.
humanize elapsed time
def elapsed_time(start, end):
"""
>>> from datetime import datetime
>>> elapsed_time(datetime(2000, 1, 1), datetime(2000, 1, 1, 20, 15))
'20 hours, and 15 minutes'
>>> elapsed_time(datetime(2000, 1, 1), datetime(2000, 1, 1, 0, 1))
'1 minute'
>>> elapsed_time(datetime(2000, 1, 1), datetime(2000, 1, 2, 0, 1))
'1 day, and 1 minute'
>>> elapsed_time(datetime(2000, 1, 1), datetime(2000, 1, 2, 2, 3, 4))
'1 day, 2 hours, 3 minutes, and 4 seconds'
"""
assert start < end
td = end - start
constants = ((3600 * 24, 'day'), (3600, 'hour'), (60, 'minute'), (1, 'second'))
ts = td.seconds + td.days * 24 * 3600
out = []
total = 0
for coef, name in constants:
t = math.floor((ts - total) / coef)
if t > 0:
out.append("%d %s%s" % (t, name, 's' if t > 1 else ''))
total += t * coef
if len(out) > 1:
out[-1] = "and %s" % out[-1]
return ', '.join(out)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment