Преобразование timedelta в дни, часы и минуты
У меня есть timedelta. Мне нужны дни, часы и минуты от этого - либо как кортеж, либо как словарь... Я не волнуюсь.
Я, должно быть, сделал это дюжину раз на дюжине языков за эти годы, но у Python обычно есть простой ответ на все, поэтому я подумал, что спрошу здесь, прежде чем вырвать какую-то тошнотворно простую (но многословную) математику.
Мистер Фуз поднимает хороший вопрос.
Я имею дело с "списками" (немного похоже на списки ebay), где каждый из них имеет продолжительность. Я пытаюсь найти оставшееся время, делая when_added + duration - now
Я прав, говоря, что это не будет учитывать DST? Если нет, то какой самый простой способ добавить/вычесть час?
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