Рассчитать разницу во времени с помощью python

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

Я имею в виду, если у меня есть 2 входных строк:

  1. '2013-10-05T01:21:07Z'
  2. '2013-10-05T01: 21: 16Z'

Как я могу рассчитать разницу во времени и распечатать ее в качестве вывода.

Я знаю, что это звучит немного глупо, но любая помощь в этом приветствуется.

3 ответов


разбор строк с помощью strptime():

a = time.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ')
b = time.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ')

это будет анализировать заданные строки времени как локальное время (установка летнего времени (DST) на автоматический), а результаты-временные структуры. Они по-прежнему отражают, был ли DST явно выключен (0), включен (1) или неявно автоматический (-1). Преобразуйте их в float (секунды с 1970-01-01):

a = time.mktime(a)
b = time.mktime(b)

затем вычислите разницу (в секундах):

d = b - a

и преобразовать их в дни / часы / минуты / секунды:

days = int(d) / 86400
hours = int(d) / 3600 % 24
minutes = int(d) / 60 % 60
seconds = int(d) % 60

последний блок работает только правильно для положительных различий, поэтому будьте осторожны, чтобы не поменять a и b ;-)

но @J. F. Себастьян правильно указал, что это может быть не то, что вы намеревались. Судя по нотации, ваши строки описывают время UTC, а не местное время. Для простых временных различий это актуально, если ваше время охватывает переключатель DST. В этом случае это, конечно, приведет к времени разница в один час слишком велика или один час слишком мал (потому что UTC всегда без DST).

чтобы избежать этого, вы можете установить флаг DST из автоматического (-1) в фиксированное значение (e. г. 0 для off) и используйте следующие значения:

a = time.mktime(a[:-1] + (0,))  # switch DST to off
b = time.mktime(b[:-1] + (0,))

или, как указал @J. F. Sebastian, вы можете забыть о time модуль и вместо того, чтобы использовать datetime.datetime который не знает о DST аспекте:

a = datetime.datetime.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ')
b = datetime.datetime.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ')

тогда результаты datetime объекты, которые можно вычесть напрямую получить timedelta объект, который представляет такую разницу во времени, как вы хотите. Печать это приведет к sth как 0:00:05 что может быть именно то, что вы ищете.


вы, похоже, используете формат ISO 8601 dateTime. Этот формат используется во многих местах,включая формат обмена GPS.

[-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]

использование datetime:

import datetime
a = datetime.datetime.strptime("2013-10-05T01:21:07Z", "%Y-%m-%dT%H:%M:%SZ")
b = datetime.datetime.strptime("2013-10-05T01:21:16Z", "%Y-%m-%dT%H:%M:%SZ")
c = b - a
print(c)

плюсы:

  • встроенный в стандартную библиотеку Python
  • объектно-ориентированный интерфейс

недостатки:

  • потребность вручную отрегулировать другой действительный ИСО 8601 представления, такие как '2013-10-05T01:21:16+00:00'
  • выдает исключение для високосных секунд, таких как '2012-06-30T23:59:60Z'

использование python-dateutil:

import dateutil.parser
a = dateutil.parser.parse("2013-10-05T01:21:07Z")
b = dateutil.parser.parse("2013-10-05T01:21:16Z")
c = b - a
print(c)

плюсы:

  • автоматически обрабатывает практически любой формат времени

недостатки:

  • нужна библиотека python-dateutil (pip install python-dateutil)
  • бросает исключение для високосных секунд, таких как '2012-06-30T23:59:60Z'

использование время.strptime и времени.mktime, как предложено Альфей

плюсы:

  • встроенный в стандартную библиотеку Python
  • может анализировать секунды прыжка, такие как'2012-06-30T23:59:60Z'

недостатки:

  • необходимо вручную обрабатывать другие допустимые представления ISO 8601, такие как как 2013-10-05T01:21:16+00:00'
  • потеря одной високосной секунды между "2012-06-30T23:59:60Z" и "2012-07-01T00:00: 00Z" (неизбежно, не зная, когда будут происходить следующие високосные секунды)

import datetime
a = datetime.datetime.now()
b = datetime.datetime.now()
c = b - a
datetime.timedelta(0, 8, 562000)
divmod(c.days * 86400 + c.seconds, 60)

Оригинальный Ответ здесь