2011-01-26 2 views
1

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

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 нет примера, поэтому я не уверен, как он должен использоваться.

+0

Вы получили это, чтобы работать? – Nim

ответ

1

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

1989-Nov-09 15:30:42.005000 ST

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

EDIT: описание объекта часового пояса - here.


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

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 

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

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

+0

Я был очень взволнован, когда прочитал ваш ответ, но я попробовал, и это не работает для меня. Я также попытался использовать только '% s' вместо'% s * 'с теми же результатами. Я считаю, что вы неправильно интерпретируете документы относительно '% s *'; звездочка указывает сноску, в которой говорится, что это поведение уникально для Boost (так как большинство этих спецификаторов формата такие же, как 'strftime()'). Какую версию Boost вы используете? Я использую 1.40.0. – rmeador

+0

Простите, я думаю, что было 2 часа, когда я посмотрел на это. У меня есть только 1.4.5 для тестирования, см. Обновление ... – Nim

+0

это увлекательно ... Я уже работал над проблемой по-другому, но я соглашусь с ответом, хотя у меня нет сам проверил. Слишком плохо, что в документах не упоминаются ограничения на символы! Благодарю. – rmeador

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