Преобразование 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
.. вы можете легко конвертировать их самостоятельно.