Непрозрачность на контроле

Для объектов timedelta нет встроенного форматирования, но сделать это очень легко:

days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

Или, что то же самое, если вы находитесь в Python версии 2.7 или 3.2+:

seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

Теперь вы можете распечатать его, но вы хотите:

'{} minutes, {} hours'.format(minutes, hours)

Например:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = days * 24 + seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return hours, minutes, seconds
td = datetime.timedelta(2, 7743, 12345)
hours, minutes, seconds = convert_timedelta(td)
print '{} minutes, {} hours'.format(minutes, hours)

Это напечатает:

9 minutes, 50 hours

Если вы хотите получить «10 минут, 1 час» вместо «10 минут, 1 час», вам тоже нужно сделать это вручную:

print '{} minute{}, {} hour{}'.format(minutes, 's' if minutes != 1 else '',
                                      hours, 's' if minutes != 1 else '')

Или вы можете захотеть написать функцию english_plural для выполнения бит 's' для вас, вместо того, чтобы повторять себя.

Из ваших комментариев это звучит так, будто вы действительно хотите, чтобы дни были раздельными. Это еще проще:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return days, hours, minutes, seconds

Если вы хотите преобразовать это значение в одно значение для хранения в базе данных, затем преобразуйте это единственное значение обратно для его форматирования, сделайте следующее:

def dhms_to_seconds(days, hours, minutes, seconds):
    return (((days * 24) + hours) * 60 + minutes) * 60 + seconds

def seconds_to_dhms(seconds):
    days = seconds // (3600 * 24)
    hours = (seconds // 3600) % 24
    minutes = (seconds // 60) % 60
    seconds = seconds % 60
    return days, hours, minutes, seconds

Итак, соединяя его:

def store_timedelta_in_database(thingy, duration):
    seconds = dhms_to_seconds(*convert_timedelta(duration))
    db.execute('INSERT INTO foo (thingy, duration) VALUES (?, ?)',
               thingy, seconds)
    db.commit()

def print_timedelta_from_database(thingy):
    cur = db.execute('SELECT duration FROM foo WHERE thingy = ?', thingy)
    seconds = int(cur.fetchone()[0])
    days, hours, minutes, seconds = seconds_to_dhms(seconds)
    print '{} took {} minutes, {} hours, {} days'.format(thingy, minutes, hours, days)
7
задан Jens 21 February 2011 в 10:31
поделиться