Преобразование даты и времени ISO 8601 в секунды в Python

Я пытаюсь добавить два раза вместе. Отметка времени ISO 8601 - "1984-06-02T19:05:00.000Z", и я хотел бы преобразовать ее в секунды. Я пытался использовать модуль Python iso8601, но это только парсер.

Какие-либо предложения?

3 ответа

Решение

Если вы хотите получить секунды с начала эпохи, вы можете использовать python-dateutil преобразовать его в datetime объект, а затем преобразовать его так секунд, используя strftime метод. Вот так:

>>> import dateutil.parser as dp
>>> t = '1984-06-02T19:05:00.000Z'
>>> parsed_t = dp.parse(t)
>>> t_in_seconds = parsed_t.strftime('%s')
>>> t_in_seconds
'455047500'

Таким образом, вы были на полпути там:)

Ваша дата - время UTC в формате RFC 3339, вы можете проанализировать ее, используя только stdlib:

from datetime import datetime

utc_dt = datetime.strptime('1984-06-02T19:05:00.000Z', '%Y-%m-%dT%H:%M:%S.%fZ')

# Convert UTC datetime to seconds since the Epoch
timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds()
# -> 455051100.0

Смотрите также Преобразование datetime.date в метку времени UTC в Python.

Как мне преобразовать его обратно в формат ISO 8601?

Чтобы преобразовать метку времени POSIX обратно, создайте из нее объект даты и времени UTC и отформатируйте его, используя .strftime() метод:

from datetime import datetime, timedelta

utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
print(utc_dt.strftime('%Y-%m-%dT%H:%M:%S.%fZ'))
# -> 1984-06-02T19:05:00.000000Z

Примечание. Он печатает шесть цифр после десятичной точки (микросекунды). Чтобы получить три цифры, см. Форматирование микросекунд в 2 десятичных знака (фактически преобразование микросекунд в десятки микросекунд).

Вот решение в Python 3:

$ date +%s
1428030452
$ TZ=US/Pacific date -d @1428030452 '+%Y%m%d %H:%M:%S %z'
20150402 20:07:32 -0700
$ TZ=US/Eastern date -d @1428030452 '+%Y%m%d %H:%M:%S %z'
20150402 23:07:32 -0400
$ python3
>>> from datetime import datetime,timezone
>>> def iso2epoch(ts):
...     return int(datetime.strptime(ts[:-6],"%Y%m%d %H:%M:%S").replace(tzinfo=timezone.utc).timestamp()) - (int(ts[-2:])*60 + 60 * 60 * int(ts[-4:-2]) * int(ts[-5:-4]+'1'))
...
>>> iso2epoch("20150402 20:07:32 -0700")
1428030452
>>> iso2epoch("20150402 23:07:32 -0400")
1428030452
>>>
Другие вопросы по тегам