NDOJ/judge/utils/timedelta.py
2020-01-21 15:35:58 +09:00

90 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)