boost :: local_time Не правильно читает iso_extended_format

Мне нужно прочитать время с расширенным форматом ISO и преобразовать его в время UTC, как в Javascript Date объекты делают:

новая дата («2014-12-19T15: 53: 14.533 + 01: 00»)

2014-12-19T14: 53: 14.533Z

В бусте нет boost::posix_time::from_iso_extended_string а также boost::posix_time::from_iso_string не разбирает часовые пояса. Я пытаюсь использовать boost::local_time::local_date_time но похоже что это тоже не работает

    std::stringstream ss("2014-12-19T15:53:14.533+01:00");
boost::local_time::local_time_input_facet*
ifc= new boost::local_time::local_time_input_facet();
ifc->set_iso_extended_format();
ss.imbue(std::locale(ss.getloc(), ifc));
boost::local_time::local_date_time
zonetime(boost::local_time::not_a_date_time);
if( ss >> zonetime ) {
time = zonetime.utc_time();
}

Любая помощь или предложения?

Жить на колиру

2

Решение

Часовой пояс вообще не анализируется:

Жить на Колиру

#include <iostream>
#include <sstream>
#include <boost/date_time.hpp>

int main()
{
boost::posix_time::ptime time;
try
{
std::stringstream ss("2014-12-19T15:53:14.533+01:00");
boost::local_time::local_time_input_facet* ifc= new boost::local_time::local_time_input_facet();
ifc->set_iso_extended_format();
ss.imbue(std::locale(ss.getloc(), ifc));
boost::local_time::local_date_time zonetime(boost::local_time::not_a_date_time);
if( ss >> zonetime ) {
time = zonetime.utc_time();
}

std::string remains;
if (std::getline(ss, remains))
std::cout << "Remaining: '" << remains << "'\n";

}
catch( std::exception const& e )
{
std::cout << "ERROR:" << e.what() <<std::endl;
}

std::cout << "UTC time: " << time;

return 0;
}

Печать:

Remaining: '+01:00'
UTC time: 2014-Dec-19 15:53:14.533000

документация говорит:

В настоящее время объекты local_date_time могут передаваться только со строкой часового пояса Posix. Полное описание строки часового пояса Posix можно найти в документации по классу posix_time_zone.

Таким образом, вам нужно либо анализировать часовые пояса отдельно, либо использовать часовые пояса POSIX. Да, я считаю, что это очень запутанно и является недостатком. По сути, вы не можете использовать расширенный формат ISO с местным временем.

Вы сможете использовать %ZP вместо:

Жить на Колиру

#include <iostream>
#include <sstream>
#include <boost/date_time.hpp>

int main()
{
boost::posix_time::ptime time;
try
{
std::stringstream ss("2014-12-19T15:53:14.533-07:00");

boost::local_time::local_time_input_facet* ifc= new boost::local_time::local_time_input_facet("%Y-%m-%d %H:%M:%S%F %ZP");
//ifc->set_iso_extended_format();
ss.imbue(std::locale(ss.getloc(), ifc));

using namespace boost::local_time;
local_date_time ldt(not_a_date_time);

if(ss >> ldt) {
time = ldt.utc_time();

std::string remains;
if (std::getline(ss, remains))
std::cout << "Remaining: '" << remains << "'\n";
}

}
catch( std::exception const& e )
{
std::cout << "ERROR:" << e.what() <<std::endl;
}

std::cout << "UTC time: " << time;

return 0;
}

Печать

UTC time: 2014-Dec-19 22:53:14.533000
2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector