2012-08-04 57 views
4

我需要能够在C++中转换和比较日期。我发现Boost库非常适合我的需要,但我不能让它正常工作:比较日期C++(使用boost)

// include headers... 

using namespace boost::posix_time; 
using namespace boost::gregorian; 

ptime p1(second_clock::universal_time()); 

p1 -= weeks(5); // Subtract 5 weeks from p1 using boost... 

std::string old_date("2011-11-19"); // format:YYYY-MM-DD 

std:stringstream ss(old_date); 

ptime p2; 

p2 << ss; 

if(p1 <= p2){ 
    // this should not happen in this case (yet it does!) p1 > p2!! 
} 

基本上我希望能够减去周(或月)当地日期,然后比较以YYYY-MM-DD格式的字符串形式给出日期...

回答

2

您的区域设置可能未设置为识别YYYY-MM-DD格式的日期。尝试设置输入方面的格式,如Format Strings示例中所示。

以下示范如何设置一个字符串流的输入和输出格式为“ISO扩展”的例子:

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

int main() 
{ 
    using namespace boost::gregorian; 
    using namespace boost::posix_time; 
    using namespace std; 

    stringstream ss; 

    /****** format strings ******/ 
    time_facet* output_facet = new time_facet(); 
    time_input_facet* input_facet = new time_input_facet(); 
    ss.imbue(locale(ss.getloc(), output_facet)); 
    ss.imbue(locale(ss.getloc(), input_facet)); 
    output_facet->format(time_facet::iso_time_format_extended_specifier); 
    input_facet->format(time_input_facet::iso_time_format_extended_specifier); 
    ptime t(second_clock::local_time()); 
    ss << t; 
    cout << ss.str() << endl; // 2012-08-03 23:46:38 
    ss.str("2000-01-31 12:34:56"); 
    ss >> t; 
    assert(t.date().year() == 2000); 
    assert(t.date().month() == 1); 
    assert(t.date().day() == 31); 
    assert(t.time_of_day().hours() == 12); 
    assert(t.time_of_day().minutes() == 34); 
    assert(t.time_of_day().seconds() == 56); 
} 
+0

明白了现在的工作。谢谢您的帮助! – user1432032 2012-08-04 03:41:37