Python конвертирует форматированную строку даты и времени в секунды

Я пытаюсь декодировать строку даты в эпоху, но у меня возникают трудности с получением часового пояса. Это дата последнего изменения ключей Amazon S3.

time.strptime(key.last_modified, '%Y-%m-%dT%H:%M:%S.%Z')

ValueError: time data u'2013-10-20T00:41:32.000Z' 
            does not match format '%Y-%m-%dT%H:%M:%S.%Z'

Если я избавлюсь от часового пояса (.000Z), он сработает, но мне также нужен часовой пояс.


person Vame    schedule 20.10.2013    source источник
comment


Ответы (2)


.000Z не распознается как смещение часового пояса. На самом деле у вас есть миллисекунды и часовой пояс (Z – это UTC), и официально синтаксический анализатор time.strptime() не может обрабатывать миллисекунды. На некоторых платформах %f будет анализировать микросекундную часть, а затем отбрасывать информацию.

Однако метод класса datetime.datetime.strptime() может , но не часовой пояс; проанализируйте Z как литерал, и он работает:

from datetime import datetime

datetime.strptime(key.last_modified, '%Y-%m-%dT%H:%M:%S.%fZ')

Демо:

>>> from datetime import datetime
>>> import time
>>> example = u'2013-10-20T00:41:32.000Z'
>>> datetime.strptime(example, '%Y-%m-%dT%H:%M:%S.%fZ')
datetime.datetime(2013, 10, 20, 0, 41, 32)
>>> time.strptime(example, '%Y-%m-%dT%H:%M:%S.%fZ')
time.struct_time(tm_year=2013, tm_mon=10, tm_mday=20, tm_hour=0, tm_min=41, tm_sec=32, tm_wday=6, tm_yday=293, tm_isdst=-1)

Обратите внимание, что на моем ноутбуке с Mac OS X %f работает на time.strptime(); однако не гарантируется, что он будет работать везде.

Преобразование объекта datetime.datetime() в кортеж времени можно выполнить с помощью метода datetime.timetuple() .

person Martijn Pieters    schedule 20.10.2013
comment
Боже мой ... Я полагаю, я так привык использовать datetime (и это в вашем ответе), что я даже забыл, что есть time.strptime. В следующий раз я полагаю, что прочитаю вопрос (и ответ!) более тщательно. Извините, что поторопился. - person mgilson; 20.10.2013

2013-10-20T00:41:32.000Z

В этой строке 32.000 — это секунды с точностью до тысячного разряда. «Z» — это часовой пояс UTC, в просторечии известный как зулусское время.

Если вы посмотрите на эту таблицу в Python 2. x docs, аргумент %S может обрабатывать только диапазон [00, 61] включительно без десятичных точек. 61 — для учета високосных секунд. Вот почему ваши строковые форматы не совпадают. Вам нужно будет удалить три нуля после десятичной точки из вашей строки.

person djwbrown    schedule 20.10.2013
comment
Черт, избит до отказа ... но ответ Мартейна гораздо более обстоятелен. - person djwbrown; 20.10.2013