Как разбирать вывод Python datetime.str с помощью strptime? [Дубликат]

В чем разница между Object obj(args...) и Object obj{args...}?

Первая - direct-initialization , а вторая - direct -list-инициализации . Это упоминается в двух разных разделах:

§8.5 / 16 [dcl.init]

Инициализация, которая происходит в формах

 T x(a);
 T x{a};

, а также в выражениях new (5.3.4), static_cast (5.2.9), преобразования типа функциональных обозначений (5.2.3) и инициализаторы базиса и члена (12.6. 2) называется прямой инициализацией .

и §8.5.4 / 1 [dcl.init.list]

List-initialization - инициализация объекта или ссылки из braced-init-list . Такой инициализатор называется списком инициализаторов , а разделяемые запятой -инициализаторы-предложения списка называются элементами списка инициализаторов. Список инициализаторов может быть пустым. Инициализация списка может возникать в контекстах с прямой инициализацией или копированием; list-initialization в контексте прямой инициализации называется direct-list-initialization , а инициализация списка в контексте инициализации копирования называется copy-list-initial-initialization .


Есть несколько отличий между ними:

  • Если построенный тип имеет конструктор, который принимает аргумент initializer_list, direct-list-initialization всегда будет поддерживать этот конструктор. Другие конструкторы будут рассмотрены только в том случае, если конструктор initializer_list не является жизнеспособным. §13.3.1.7 / 1 [over.match.list]
  • direct-list-initialization не позволяет сужать преобразования в списке аргументов. §8.5.4 / 3 [dcl.init.list]
  • Если инициализированный тип является агрегатом, direct-list-initialization будет выполнять агрегатная инициализация. §8.5.4 / 3 [dcl.init.list]
  • Порядок оценки элементов braced-init-list из слева направо. §8.5.4 / 4 [dcl.init.list]
  • Вы можете избежать наиболее неприятного анализа с помощью direct-list-initialization

& nbsp;

  struct foo{};
  struct bar 
  {    
    bar(foo const&) {}
  };

  bar b1(foo()); // most vexing parse
  bar b2(foo{}); // all 3 of the following construct objects of type bar
  bar b3{foo()};
  bar b4{foo{}};
36
задан jfs 3 February 2015 в 18:10
поделиться

4 ответа

Вы не можете, не без большого кропотливого ручного определения часового пояса.

Python не включает базу данных часового пояса, потому что она будет устаревать слишком быстро. Вместо этого Python полагается на внешние библиотеки, которые могут иметь гораздо более быстрый цикл выпуска, чтобы обеспечить вам правильно настроенные часовые пояса.

В качестве побочного эффекта это означает, что разметка часового пояса также должна быть внешняя библиотека. Если dateutil слишком тяжелый для вас, вместо этого используйте iso8601 , он отлично разбирает ваш конкретный формат:

>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)

iso8601 является whopping 4KB маленький. Сравните этот файл python-dateutil с 148 КБ.

Начиная с Python 3.2 Python может обрабатывать простые временные интервалы на основе смещения, а %z будет анализировать -hhmm и +hhmm временные смещения в метке времени. Это означает, что для метки времени ISO 8601 вам нужно будет удалить : в часовом поясе:

>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))

Отсутствие правильного синтаксического анализа ISO 8601 отслеживается в Python issue 15873 .

49
ответ дан Martijn Pieters 22 August 2018 в 12:44
поделиться
  • 1
    Мне кажется, datetime может включать в себя что-то вроде iso8601 для обработки часовых поясов ISO 8601 - бит разбора и два подкласса tzinfo. – eryksun 1 November 2012 в 19:32
  • 2
    @eryksun: ISO8601 действительно упрощен по отношению к часовым поясам, но как только вы включаете эти смещения в stdlib python, вы будете наводнены недоразумениями о том, почему реальные часовые пояса (которые больше, чем просто смещение) не работают и т. д. – Martijn Pieters♦ 1 November 2012 в 19:35
  • 3
    нелегко определить класс FixedOffset. Вот пример кода – jfs 3 February 2015 в 18:14

Есть две проблемы с кодом в исходном вопросе: в часовом поясе не должно быть «:», а строка формата для «часового пояса в качестве смещения» - это нижний регистр «% z» не верхний «% Z», .

Это работает для меня в Python v3.6

>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00
1
ответ дан Jamie Czuy 22 August 2018 в 12:44
поделиться
  • 1
    Когда это неправильно, почему print(t) добавляет двоеточие в смещение utc? – moooeeeep 9 August 2017 в 09:58
  • 2
    @moooeeeep Поскольку по умолчанию datetime использует isoformat(sep=' ') для функции __str__, которая печатает смещение UTC как «+ HH: MM». Использование print(t.strftime("%Y-%m-%dT%H:%M:%S%z")) будет печатать без "& quot; & quot; в часовом поясе. – Jamie Czuy 21 August 2017 в 20:05
  • 3
    Наличие двоеточия в часовом поясе не является неправильным. Многие источники представляют свое время в строковой форме: 2012-11-01T04:16:13-04:00. ОП пытается разобрать эту форму. – DaveL17 28 February 2018 в 14:52

Вот файл Python Doc для объекта datetime, использующий пакет dateutil ..

from dateutil.parser import parse

get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
25
ответ дан Mohideen ibn Mohammed 22 August 2018 в 12:44
поделиться
  • 1
    Предполагается, что это правильный ответ для этого без внешней библиотеки – Paullo 16 July 2018 в 20:18

Я новичок в Python, но нашел способ конвертировать

2017-05-27T07:20:18.000-04:00 в

2017-05-27T07:20:18 без загрузки новых утилит.

from datetime import datetime, timedelta

time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04

item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)

Я уверен, что есть лучшие способы сделать это, не нарезая строку так много, но это выполнило свою работу.

-2
ответ дан wiseco68 22 August 2018 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: