В чем разница между
blockquote>Object obj(args...)
иObject obj{args...}
?Первая - direct-initialization , а вторая - direct -list-инициализации . Это упоминается в двух разных разделах:
§8.5 / 16 [dcl.init]
Инициализация, которая происходит в формах
T x(a); T x{a};
, а также в выражениях
blockquote>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 .
blockquote>
Есть несколько отличий между ними:
- Если построенный тип имеет конструктор, который принимает аргумент
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{}};
Вы не можете, не без большого кропотливого ручного определения часового пояса.
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 .
Есть две проблемы с кодом в исходном вопросе: в часовом поясе не должно быть «:», а строка формата для «часового пояса в качестве смещения» - это нижний регистр «% 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
print(t)
добавляет двоеточие в смещение utc?
– moooeeeep
9 August 2017 в 09:58
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
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
Я новичок в 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)
Я уверен, что есть лучшие способы сделать это, не нарезая строку так много, но это выполнило свою работу.
datetime
может включать в себя что-то вродеiso8601
для обработки часовых поясов ISO 8601 - бит разбора и два подклассаtzinfo
. – eryksun 1 November 2012 в 19:32FixedOffset
. Вот пример кода – jfs 3 February 2015 в 18:14