Рассчитать разницу во времени с помощью python
Мне интересно, есть ли способ или встроенная библиотека, чтобы найти разницу во времени от двух строковых входных данных.
Я имею в виду, если у меня есть 2 входных строк:
- '2013-10-05T01:21:07Z'
- '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)
Оригинальный Ответ здесь