Python рассчитывает разницу во времени, чтобы дать "годы, месяцы, дни, часы, минуты и секунды в 1

Я хочу знать, сколько лет, месяцев, дней, часов, минут и секунд между "2014-05-06 12:00:56" и "2012-03-06 16:08:22". Результат будет выглядеть так: "разница составляет ххх год ххх месяц ххх дней ххх часов ххх минут"

Например:

import datetime

a = '2014-05-06 12:00:56'
b = '2013-03-06 16:08:22'

start = datetime.datetime.strptime(a, '%Y-%m-%d %H:%M:%S')
ends = datetime.datetime.strptime(b, '%Y-%m-%d %H:%M:%S')

diff = start – ends

если:

diff.days

Это дает разницу в днях.

Что еще я могу сделать? И как я могу достичь желаемого результата?

Ответ 1

Используйте relativedelta из пакета dateutil. Это будет учитывать високосные годы и другие причуды.

import datetime
from dateutil.relativedelta import relativedelta

a = '2014-05-06 12:00:56'
b = '2013-03-06 16:08:22'

start = datetime.datetime.strptime(a, '%Y-%m-%d %H:%M:%S')
ends = datetime.datetime.strptime(b, '%Y-%m-%d %H:%M:%S')

diff = relativedelta(start, ends)

>>> print "The difference is %d year %d month %d days %d hours %d minutes" % (diff.years, diff.months, diff.days, diff.hours, diff.minutes)
The difference is 1 year 1 month 29 days 19 hours 52 minutes

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

Ответ 2

diff - это экземпляр timedelta.

для python2, см. https://docs.python.org/2/library/datetime.html#timedelta-objects

для python 3, см. https://docs.python.org/3/library/datetime.html#timedelta-objects

из документов:

атрибуты экземпляра timdelta (только для чтения):

  • дней
  • секунд
  • микросекунд

методы экземпляра timdelta:

  • total_seconds()

атрибуты класса timdelta:

  • мин
  • макс
  • Разрешение

Вы можете использовать атрибуты экземпляра days и seconds, чтобы рассчитать, что вам нужно.

например:

import datetime

a = '2014-05-06 12:00:56'
b = '2013-03-06 16:08:22'

start = datetime.datetime.strptime(a, '%Y-%m-%d %H:%M:%S')
ends = datetime.datetime.strptime(b, '%Y-%m-%d %H:%M:%S')

diff = start - ends

hours = int(diff.seconds // (60 * 60))
mins = int((diff.seconds // 60) % 60)