2014-12-02 6 views
11

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

Любые предложения?

+0

Какие секунды? Секунды с эпохи? –

+0

Думаю, да. Это моя первая работа с датами. –

+0

Связанный: [Преобразование RFC 3339 времени в стандартную метку времени Python] (http://stackoverflow.com/q/1941927/4279) – jfs

ответ

9

Если вы хотите получить секунды с начала эпохи, вы можете использовать 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' 

Так вы были на полпути :)

+0

Спасибо feynman21. Я смотрю документацию dateutil.parser. Что делать, если я хочу преобразовать его обратно в формат ISO. –

+1

проверьте [это] (https://docs.python.org/2/library/datetime.html). 'datetime.isoformat()' должен иметь то, что вы ищете. Поэтому сначала нужно преобразовать строку обратно в объект 'datetime', используя' strptime', а затем вызвать 'isoformat' на этом объекте. – hopla

+0

http://stackoverflow.com/questions/3401428/how-to-get-an-isoformat-datetime-string-including-the-default-timezone Большое спасибо за вашу помощь. –

7

Ваша дата время UTC в RFC 3339 format, можно разобрать его, используя только 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 

Смотрите также Converting datetime.date to UTC timestamp in Python

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

Для преобразования POSIX метки времени назад, создать объект UTC DATETIME из него, и отформатировать его с помощью .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 

Примечания: Он печатает шесть цифр после десятичной точки (микросекунды). Чтобы получить три цифры, см. Formatting microseconds to 2 decimal places (in fact converting microseconds into tens of microseconds).

+0

Вы случайно знаете, как преобразовать его в формат ISO 8601? До сих пор anotherTime = datetime.datetime.fromtimestamp (timestamp) .isoformat(), но он форматирует .000Z. Какие-либо предложения?Я пробовал несколько вещей, но все, что у меня было, это ошибки –

+0

@ user3426338: Я обновил ответ, чтобы показать, как преобразовать временную метку (число) в строку формата ISO 8601. – jfs

+0

благодарит за вашу помощь. –

-1

Вот решение в 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 
>>> 
+0

Впечатляюще короткий чистый stdlib TZ-осведомленный парсинг! Увы, это не формат ISO 8601 (см. Пример или вопрос «date -iso-8601 = ns'). Стандарт ISO позволяет * тонны * форматов, так что strptime безнадежен, но разбор только форматов '± hh: mm',' Z' (подмножество RFC3339) во многих случаях будет достаточно хорошим. –

 Смежные вопросы

  • Нет связанных вопросов^_^