Информация об изменениях

Сообщение Re: Boost.DateTime - непонятка с фасетами и форматированием от 28.11.2014 5:24

Изменено 28.11.2014 5:25 LowCoder

Здравствуйте, LowCoder, Вы писали:

LC>Прошу помочь советом – мне нужно из строки в которой содержится дата и время получить количество секунд с начала эпохи (1.1.1970) (ну или вообще с начала эры то не суть). Строка может быть в разных форматах. Для решения проблемы я решил (точнее мне нужнет именно он по тех заданию) использовать boost (1.54) DataTime но что то совсем запутался с их фасетами.


LC>Вот такая функция упорно возвращает для трех даты времени одинаковое количество секунд


LC>
LC>int64_t getSecondsFromDate( const std::string& strDate, const std::string& format )
LC>{
LC>   namespace bpt = boost::posix_time;
LC>   typedef bpt::time_facet time_facet;
LC>   typedef bpt::ptime ptime;
 
LC>   bpt::time_facet* facet = new bpt::time_facet();
LC>   facet->format( format.c_str() );

LC>   std::stringstream ss( strDate.c_str() );
LC>   ss.imbue( std::locale(ss.getloc(), facet) );

LC>   bpt::ptime pt;
LC>   ss >> pt;

LC>   static bpt::ptime epoch( boost::gregorian::date(1970, 1, 1) );
LC>   bpt::time_duration diff( pt - epoch );
LC>   return diff.total_seconds();
LC>}

LC>...
LC>std::string date1 = "20080501123045";
LC>std::string date2 = "20080501134045";
LC>std::string date3 = "20080501164045";

LC>int64_t sec1 = getSecondsFromDate( date1, "%Y%m%d%H%M%S" );
LC>int64_t sec2 = getSecondsFromDate( date2, "%Y%m%d%H%M%S" );
LC>int64_t sec3 = getSecondsFromDate( date3, "%Y%m%d%H%M%S" );

LC>std::cout << "Date1=" << sec1 << " Date2=" << sec2 << " Date3=" << sec3 << std::endl;

LC>Output
LC>Date1=2077252342 Date2=2077252342 Date3=2077252342
LC>


LC>Те никакие мои ухищерения не работают – всегда количество секунд одинаковое. Как быть?



ОО! сам спросил и сам ответил — всегда приятно пообщатся с умным человеком все дело было в более вдумчивом чтении манула — решилось заменой строчки

bpt::time_facet* facet = new bpt::time_facet();


на

bpt::time_input_facet* facet = new bpt::time_input_facet();


и все заработало

Тем не менне приветствуются любые комментарии
Re: Boost.DateTime - непонятка с фасетами и форматированием
ОО! сам спросил и сам ответил — всегда приятно пообщатся с умным человеком все дело было в более вдумчивом чтении манула — решилось заменой строчки

bpt::time_facet* facet = new bpt::time_facet();


на

bpt::time_input_facet* facet = new bpt::time_input_facet();


и все заработало

Тем не менне приветствуются любые комментарии