91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
|
import datetime
|
||
|
|
||
|
from django.utils.translation import npgettext, pgettext, ungettext
|
||
|
|
||
|
|
||
|
def nice_repr(timedelta, display='long', sep=', '):
|
||
|
"""
|
||
|
Turns a datetime.timedelta object into a nice string repr.
|
||
|
|
||
|
display can be 'minimal', 'short' or 'long' [default].
|
||
|
|
||
|
>>> from datetime import timedelta as td
|
||
|
>>> nice_repr(td(days=1, hours=2, minutes=3, seconds=4))
|
||
|
'1 day, 2 hours, 3 minutes, 4 seconds'
|
||
|
>>> nice_repr(td(days=1, seconds=1), 'minimal')
|
||
|
'1d, 1s'
|
||
|
"""
|
||
|
|
||
|
assert isinstance(timedelta, datetime.timedelta), 'First argument must be a timedelta.'
|
||
|
|
||
|
result = []
|
||
|
|
||
|
weeks = timedelta.days // 7
|
||
|
days = timedelta.days % 7
|
||
|
hours = timedelta.seconds // 3600
|
||
|
minutes = (timedelta.seconds % 3600) // 60
|
||
|
seconds = timedelta.seconds % 60
|
||
|
|
||
|
if display == 'simple-no-seconds':
|
||
|
days += weeks * 7
|
||
|
if days:
|
||
|
if hours or minutes:
|
||
|
return '%d day%s %d:%02d' % (days, 's'[days == 1:], hours, minutes)
|
||
|
return '%d day%s' % (days, 's'[days == 1:])
|
||
|
else:
|
||
|
return '%d:%02d' % (hours, minutes)
|
||
|
elif display == 'sql':
|
||
|
days += weeks * 7
|
||
|
return '%d %02d:%02d:%02d' % (days, hours, minutes, seconds)
|
||
|
elif display == 'simple':
|
||
|
days += weeks * 7
|
||
|
if days:
|
||
|
return '%d day%s %02d:%02d:%02d' % (days, 's'[days == 1:], hours, minutes, seconds)
|
||
|
else:
|
||
|
return '%02d:%02d:%02d' % (hours, minutes, seconds)
|
||
|
elif display == 'localized':
|
||
|
days += weeks * 7
|
||
|
if days:
|
||
|
return npgettext('time format with day', '%d day %h:%m:%s', '%d days %h:%m:%s', days) \
|
||
|
.replace('%d', str(days)).replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes) \
|
||
|
.replace('%s', '%02d' % seconds)
|
||
|
else:
|
||
|
return pgettext('time format without day', '%h:%m:%s') \
|
||
|
.replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes).replace('%s', '%02d' % seconds)
|
||
|
elif display == 'localized-no-seconds':
|
||
|
days += weeks * 7
|
||
|
if days:
|
||
|
if hours or minutes:
|
||
|
return npgettext('time format no seconds with day', '%d day %h:%m', '%d days %h:%m', days) \
|
||
|
.replace('%d', str(days)).replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes)
|
||
|
return ungettext('%d day', '%d days', days) % days
|
||
|
else:
|
||
|
return pgettext('hours and minutes', '%h:%m').replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes)
|
||
|
elif display == 'concise':
|
||
|
days += weeks * 7
|
||
|
if days:
|
||
|
return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds)
|
||
|
else:
|
||
|
return '%02d:%02d:%02d' % (hours, minutes, seconds)
|
||
|
elif display == 'noday':
|
||
|
days += weeks * 7
|
||
|
hours += days * 24
|
||
|
return '%02d:%02d:%02d' % (hours, minutes, seconds)
|
||
|
elif display == 'minimal':
|
||
|
words = ['w', 'd', 'h', 'm', 's']
|
||
|
elif display == 'short':
|
||
|
words = [' wks', ' days', ' hrs', ' min', ' sec']
|
||
|
else:
|
||
|
words = [' weeks', ' days', ' hours', ' minutes', ' seconds']
|
||
|
|
||
|
values = [weeks, days, hours, minutes, seconds]
|
||
|
|
||
|
for i in range(len(values)):
|
||
|
if values[i]:
|
||
|
if values[i] == 1 and len(words[i]) > 1:
|
||
|
result.append('%i%s' % (values[i], words[i].rstrip('s')))
|
||
|
else:
|
||
|
result.append('%i%s' % (values[i], words[i]))
|
||
|
|
||
|
return sep.join(result)
|