2010-01-22 3 views
124

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

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

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

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

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

ответ

176

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

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

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

17
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 
+1

'указываете ей()' может не сработать, если локальная временная зона может иметь различное смещение в UTC разное время (многие из них) - вы можете использовать 'модуль pytz', чтобы получить доступ к базе данных TZ в портативном deteministic путь. Кроме того, местное время может быть неоднозначным (50% шансов на ошибку) - вам нужна дополнительная информация для устранения неоднозначности, например, часто (не всегда) [даты в файле журнала монотонны] (http://stackoverflow.com/a/26221183/4279). См. [Как можно вычесть день с даты python?] (Http://stackoverflow.com/q/441147/4279), который, возможно, придется решать аналогичные проблемы. – jfs

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 

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

53

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

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 
+5

неверно, если 'td.days' отличен от нуля. Вам нужны 'часы + = td.days * 24'. Если вы хотите принять во внимание доли секунды (OP не делает); 'seconds + = td.microseconds/1e6'. – jfs

Смежные вопросы