Вычисление разницы между датой и временем для ISO 8601

Я изо всех сил пытаюсь правильно обрабатывать некоторые значения даты и времени. У нас есть поставщик SaaS, который реализует свой API с кодом ответа HTTP 429, что означает, что мы превысили их скорость, и откладываемся. Они передают заголовок в «X-RateLimit-Reset», значение которого является меткой даты ISO8601, когда наши запросы сбрасываются. Я пытаюсь взять это значение, а затем взять сейчас и вычислить, сколько мне нужно ждать в секундах. Пока что я построил этот код:

    elif ask.status_code == 429:
        print("API rate limit hit. Resting...")

        # ask.headers['X-RateLimit-Reset'] is passed back with a ISO8601 time stamp of when the api limit will be reset.
        # example: “2016-12-13T18:38:00Z”
        a = time.strptime(ask.headers['X-RateLimit-Reset'], '%Y-%m-%dT%H:%M:%SZ')
        a = time.mktime(a)

        print(ask.headers['X-RateLimit-Reset'])

        # I don't get this...
        myTZ = datetime.tzinfo
        myTZ.timezone.utc

        # Calculate the offset taking into account daylight saving time
        b = datetime.utcnow().replace(tzinfo=myTZ.timezone.utc).replace(microsecond=0).isoformat()
        b = time.strptime(b, '%Y-%m-%dT%H:%M:%S%z')
        b = time.mktime(b)

        # Time in seconds to wait and retry
        apiReset = (b-a)+1

        print("Sleeping {} seconds".format(apiReset))
        time.sleep(apiReset)

        return self.CallAPI(uri, method, data, timeout)

и он просто не делает то, что мне нужно. Я удалил несколько исключений, но теперь остановился на одном:

API rate limit hit. Resting...
2018-12-18T00:07:54Z
Traceback (most recent call last):
  File "Development/evident.io/mainbody.py", line 22, in <module>
    EvidentIO.ListSubORGs()
  File "/Users/i864248/OneDrive - SAP         SE/Development/evident.io/evidentio.py", line 112, in ListSubORGs
    return self.APICallHandler('/api/v2/sub_organizations')
  File "/Users/i864248/OneDrive - SAP     SE/Development/evident.io/evidentio.py", line 297, in APICallHandler
    response = self.CallAPI(uri, method, data, timeout)
  File "/Users/i864248/OneDrive - SAP SE/Development/evident.io/evidentio.py", line 407, in CallAPI
    myTZ.timezone.utc
AttributeError: 'getset_descriptor' object has no attribute 'timezone'

Может ли кто-нибудь помочь мне в этом? Может я с самого начала даже не правильно делаю?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
66
1

Ответы 1

Хорошо, конечно, вскоре после публикации я нашел достойное решение. Используя несколько примеров из других источников, я сократил код до следующего:

a = datetime.strptime(ask.headers['X-RateLimit-Reset'], '%Y-%m-%dT%H:%M:%SZ')
timestamp = (a - datetime(1970, 1, 1)).total_seconds()

ts = time.time()
timeDiff = (timestamp - ts)

print("Sleeping for {} seconds".format(timeDiff))
time.sleep(timeDiff + 1) 
print("Continuing")
return self.CallAPI(uri, method, data, timeout)

И это, кажется, работает очень хорошо.

Другие вопросы по теме