2012-12-21 76 views
2

我需要使用boost::spirit將日期時間字符串如2012-12-21 12:10:35解析爲time_t值。這裏是我的代碼片段:用精神解析日期時間字符串到time_t值

tc_  = lexeme[int_[phx::ref(tm_.tm_year)=(_1-1900)]>>'-' 
        >>int_[phx::ref(tm_.tm_mon)=(_1-1)]>>'-' 
        >>int_[phx::ref(tm_.tm_mday)=_1]>>+space 
        >>int_[phx::ref(tm_.tm_hour)=_1]>>':' 
        >>int_[phx::ref(tm_.tm_min)=_1]>>':' 
        >>int_[phx::ref(tm_.tm_sec)=_1]] [_val = (long)mktime(&tm_)]; 

其中tc_qi規則類型:qi::rule<Iterator, long(), Skipper>tm_struct tm類型的成員變量。

該代碼編譯,但不起作用。似乎mktime()根本沒有被調用。我究竟做錯了什麼?

+0

感謝Andy的編輯。我是一個新手.. – napie

+0

我可以添加附件嗎?我想上傳一個cpp文件來使問題更清楚。 – napie

回答

0

你可以在C++ 11中使用正則表達式。 如果你的編譯器足夠近,這將是可移植的和標準的。

#include <iostream> 
#include <string> 
#include <regex> 
using namespace std; 

int main() 
{ 
    std::regex txt_regex("([0-9]{4})[-]([0-9]{2})[-]([0-9]{2})[ ]([0-9]{2})([:])([0-9]{2})([:])([0-9]{2})");// 
    string strTmp; 
    strTmp="2010-12-15 15:25:46"; 
    std::smatch match; 
    std::regex_search(strTmp, match, txt_regex); 

    if(regex_match(strTmp,txt_regex)) 
     cout<<"Ok"<<endl; 
    else 
    { 
    cout<<"Invalid input"<<endl; 
    return 0; 
    } 
    if (match.empty()) 
    { 
     std::cout << "...no more matches" << std::endl; 
     return 0; 
    } 
    for (auto x : match) 
    { 
     std::cout << "found: " << x << std::endl; 
    } 
    string str = match.suffix().str(); 
    cout <<str <<std::endl; 
    return 0; 
} 

用這個,你可以顯示要顯示的字符串的不同部分,然後填充結構。

希望它像往常一樣幫助和打開評論(如果有什麼不清楚或不完整)。