Временная дельта Python: не могу ли я просто получить в любой единице времени значение всей разницы?

Я пытаюсь получить некоторые умные даты с тех пор, как на моем сайте была сделана запись («секунды с тех пор, часы с тех пор, недели с тех пор и т. д.»), и я использую разницу datetime.timedelta между utcnow и utc, датированным база данных для поста.

Похоже, согласно документам, я должен использовать атрибут дней И атрибут секунд, чтобы получить причудливые строки даты, которые я хочу.

Разве я не могу просто получить в любой единице времени значение всей разницы? Я что-то упускаю?

Было бы идеально, если бы я мог просто получить всю разницу в секундах.


person Bjorn    schedule 01.02.2009    source источник


Ответы (4)


Похоже, что в Python 2.7 появился метод total_seconds(), это то, что вы искали, я верю!

person Ham    schedule 12.08.2010

Вы можете вычислить разницу в секундах.

total_seconds = delta.days * 86400 + delta.seconds

Нет, вы не «что-то упускаете». Он не предоставляет дельты в секундах.

person S.Lott    schedule 01.02.2009
comment
Это то, что я планирую сделать, но я просто не хотел, чтобы в моем коде было что-то, о чем я не знал. Спасибо. - person Bjorn; 01.02.2009
comment
Этот подход, как и total_seconds() в Python 2.7, вернет неверный результат, если дни не состоят из 24 часов (например, из-за перехода на летнее время). - person Bruno; 14.09.2011
comment
Я должен согласиться с Бруно - это будет давать неверные результаты два раза в год, так что это неправильный ответ. - person Tom Swirly; 31.01.2012
comment
Правильное значение: (td.microseconds + (td.seconds + td.days * 24 * 3600) * 106) / 106. (для версий Python ниже 2.7, которые не могут использовать total_seconds) - person markwatson; 24.04.2012
comment
@markwatson, это не совсем то же самое total_seconds(). Похоже, он усекает миллисекунды... Все равно спасибо! :-) - person semente; 18.09.2012

Было бы идеально, если бы я мог просто получить всю разницу в секундах.

Тогда простая старая метка времени unix, предоставленная модулем «время», может быть вам больше по вкусу.

Меня лично еще предстоит убедить во многом из того, что находится в «datetime».

person bobince    schedule 01.02.2009
comment
+1 за предложение решения, которое не предполагает, что во всех днях 24 часа. - person Bruno; 14.09.2011

Как сказал Бобинс, вы можете использовать временные метки, например:

# assuming ts1 and ts2 are the two datetime objects
from time import mktime
mktime(ts1.timetuple()) - mktime(ts2.timetuple())

Хотя я бы подумал, что это даже уродливее, чем просто вычисление секунд из объекта timedelta...

person itsadok    schedule 01.02.2009
comment
Вы можете еще больше усложнить ситуацию: reduce(float.__sub__, (mktime(d.utctimetuple()) for d in (ts1, ts2))) - person jfs; 01.02.2009
comment
@ J.F.Sebastian: но почему? - person Claudiu; 06.08.2013
comment
Что произойдет, если ts1 будет в одном часовом поясе, а ts2 в другом? Или они находятся в одном и том же часовом поясе, но в одном из них используется летнее время, а в другом нет? - person Qi Fan; 10.10.2015