Сбой при разборе библиотеки Boost datetime со строкой часового пояса - PullRequest
1 голос
/ 26 января 2011

Я пытаюсь проанализировать строку даты / времени в произвольном формате, используя библиотеку даты и времени Boost.Формат, который я пытаюсь использовать, довольно необычен, поскольку включает строку описания часового пояса Posix.В документах для библиотеки четко указано , что существует флаг (%ZP), используемый для ввода и вывода, который обрабатывает строку часового пояса Posix.Значение, которое я пытаюсь проанализировать, исходит из веб-браузера, и вместо того, чтобы писать JS, чтобы выполнить преобразование, указанное в строке зоны, а затем отправить на сервер в UTC, я бы предпочел сделать это на стороне сервера (так какBoost должен сделать это действительно легко).Очевидно, я не буду публиковать здесь, если это сработало.Этот код выдает boost::bad_lexical_cast со значением «значение типа источника не может быть истолковано как цель».

using namespace boost::posix_time;
using namespace boost::local_time;
using namespace boost::gregorian;

std::istringstream ss("1989-11-09T15:30:42.005;PST-8PDT,M3.2.0,M11.1.0");
ss.exceptions(std::ios_base::failbit);
local_time_input_facet* facet = new local_time_input_facet("%Y-%m-%dT%H:%M:%S%F;%ZP");
ss.imbue(std::locale(ss.getloc(), facet));

local_date_time ldt(not_a_date_time);

ss >> ldt; // do the parse

std::cout << ldt.to_string();

Однако, если вы замените строку формата на "%Y-%m-%dT%H:%M:%S%F;", синтаксический анализ завершится успешно(конечно он выводит значение в неправильном часовом поясе).

Есть идеи, что я делаю неправильно?В документах для флага %ZP нет примера, поэтому я не уверен, как его использовать.

1 Ответ

1 голос
/ 26 января 2011

Я думаю, что ваша строка формата должна выглядеть так: %Y-%m-%dT%H:%M:%s *;%ZP %s * будет соответствовать секундам и долям секунды.С этим изменением вышеприведенный код работает, как ни странно, вывод, который я получаю:

1989-Nov-09 15:30:42.005000 ST

Не уверен, почему он говорит ST вместо PST, однако часовой поясинформация анализируется правильно, если вы измените дату, например, на ноябрь-01, то она сообщит PDT.

РЕДАКТИРОВАТЬ: описание объекта часового пояса здесь .


Хорошо, из-за того, что возиться с этим, кажется, что ошибка синтаксического анализа вызвана присутствием ;, удаляя его из исходной строки так, что оно становится:

std::istringstream ss("1989-10-16T15:30:42.005 PST-8PDT,M3.2.0,M10.2.0");

И изменение строки формата на:

local_time_input_facet* facet = new local_time_input_facet("%Y-%m-%d %H:%M:%s %ZP");

правильно сообщает:

1989-Oct-16 15:30:42.005000 PST

Если вы снова измените строку ввода на:

std::istringstream ss("1989-10-16T15:30:42.005 PST-8PDT,M3.2.0,M11.1.0");

вывод снова верен:

1989-Oct-16 15:30:42.005000 PDT

Это говорит мне о том, что действительно учитывает информацию о часовом поясе, встроенную в строку ... поэтому интересный вопрос: почему это раздражает, если есть ;?

Дальнейшее обновление, похоже, что входng может содержать только буквенно-цифровые символы, символы из набора .:-, и пробелы - после дробных битов, т. е. вы не можете отделить информацию о часовом поясе ни с каким символом, кроме того, что я перечислил выше (это не является исчерпывающимвремя проверить их всех!)

...