Преобразование timedelta в дни, часы и минуты


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

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

Мистер Фуз поднимает хороший вопрос.

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

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

5 151

5 ответов:

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

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

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

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
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

Что касается DST, я думаю, что лучше всего конвертировать оба 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

Я не понимаю

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

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

timedeltas есть days и