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

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

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

Г-н Fooz поднимает хороший момент.

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Я не понимаю

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

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

Ответ 5

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