Конвертировать timedelta в дни, часы и минуты - PullRequest
190 голосов
/ 22 января 2010

У меня есть таймделта. Мне нужны дни, часы и минуты - либо в виде кортежа, либо в виде словаря ... Я не смущен.

Я, должно быть, делал это дюжину раз на дюжине языков, но у Python обычно есть простой ответ на все вопросы, поэтому я подумал, что я должен спросить здесь, прежде чем выбить тошнотворно простую (но многословную) математику.

Мистер Фуз поднимает хорошую мысль.

Я имею дело с «списками» (немного похожими на списки на ebay), где каждый из них имеет длительность. Я пытаюсь найти оставшееся время, выполнив when_added + duration - now

Правильно ли я сказал, что не будет учитывать DST? Если нет, то какой самый простой способ сложить / вычесть час?

Ответы [ 5 ]

277 голосов
/ 22 января 2010

Если у вас есть datetime.timedelta значение td, td.days уже дает вам желаемые "дни". timedelta значения сохраняют долю дня в секундах (а не в часах или минутах), так что вам действительно придется выполнять "тошнотворно простую математику", например ::10000

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60
63 голосов
/ 11 июня 2012

Это немного компактнее, часы, минуты и секунды отображаются в две строки.

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6
24 голосов
/ 22 января 2010
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

Что касается летнего времени, я думаю, что лучше всего конвертировать datetime объекты в секунды. Таким образом, система рассчитывает DST для вас.

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0
6 голосов
/ 20 октября 2011

я не понимаю

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

как насчет этого

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

Вы получаете минуты и секунды минуты как поплавок.

4 голосов
/ 22 января 2010

timedeltas имеют атрибуты days и seconds. Вы можете легко конвертировать их.

...