2015-01-28 1 views
2

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

новой Дата ("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(); 
    } 

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

Live on coliru

ответ

2

часовой пояс не разбирается на всех:

Live On Coliru

#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 

The documentation says:

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

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

Вы migth быть в состоянии использовать %ZP вместо:

Live On Coliru

#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 
+0

Благодарности. он работает. Часовой пояс POSIX отличается тем, что у них есть секунды, но я думаю, что никто не будет использовать несколько минут. Пожалуйста, измените строку времени на «2014-12-19T15: 53: 14.533-07: 00», вот что я прошу. – Arpegius

+0

@Arpegius TBH, единственная причина, по которой я могу понять, почему это просто не реализовано: очевидно, что все поддерживают обмен данными по времени UTC в пути (и при необходимости пропускают часовой пояс вне диапазона) – sehe

+0

Возможно, вы правы, но это хорошо. а затем просто проверьте символ «Z» в строке. – Arpegius