2014-07-05 48 views
1

我必須序列化爲字符串變量boost::posix_time::ptime。我想要的格式是:2014-05-12T16:14:01.809+0200。我無法更改它,因爲它是從Web服務請求的,我必須遵守所請求的格式。 我可以暗示時區是本地時區。 我看到了一些例子,但我還沒有發現任何事情讓我得到UTC ptime的std::string使用自定義格式序列化增強ptime

增加了一些我想要的細節: 我從boost::posix_time::ptime開始。我想以我之前指定的格式打印它,但我不知道我的真實時區是什麼。我必須通過庫函數調用來找到它。 那我要做的就是寫一個函數的原型如下:std::string time_to_custom_string(boost::posix_time::ptime datetime);

回答

0

如果你不介意一些尾隨000與小數秒:

#include <boost/date_time/local_time/local_time.hpp> 
#include <locale> 

static boost::local_time::time_zone_ptr const s_timezone(new boost::local_time::posix_time_zone("+02:00")); 

std::string mydateformat(boost::local_time::local_date_time const& ldt) 
{ 
    using namespace boost; 
    std::ostringstream ss; 

    boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 
    output_facet->format("%Y-%m-%dT%H:%M:%s%q"); 

    ss.str(""); 
    ss << ldt; 
    return ss.str(); 
} 

std::string mydateformat() 
{ 
    using namespace boost; 

    posix_time::ptime my_ptime = posix_time::second_clock::universal_time(); 
    local_time::local_date_time ldt(my_ptime, s_timezone); 

    return mydateformat(ldt); 
} 

int main() 
{ 
    using namespace boost; 

    gregorian::date d(2014, 5, 12); 
    posix_time::time_duration td(16, 14, 1, 809000); 
    local_time::local_date_time ldt(d, td, s_timezone, false/*daylight savings*/); 

    std::cout << mydateformat(ldt) << "\n"; 
    assert("2014-05-12T16:14:01.809000+0200" == mydateformat(ldt)); 
} 
+0

謝謝,這是不是我真的想要但可以成爲我的錯,解釋我想要的。它可以幫助我找到真正的解決方案。我用更多細節更新我的問題。 – user3807511

+0

@ user3807511已經顯示了從「ptime」獲取'local_date_time'的方式(在'mydateformat'!的第二個重載中)。要轉換爲「系統時區」,請參閱文檔。但是,請注意,相信系統時區可能構成安全漏洞。 – sehe

+0

你能解釋爲什麼'utc_time_zone'是從包含字符串'「+02:00」'的表達式初始化的嗎? –