4

C++ で日付を変換して比較できるようにする必要があります。ブーストライブラリは私のニーズにかなり合っていることがわかりましたが、正しく動作させることができません:

 // 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 形式の文字列として指定された日付と比較できるようにしたいと考えています...

4

1 に答える 1

2

YYYY-MM-DD 形式の日付を認識するようにロケールが設定されていない可能性があります。フォーマット文字列の例のように、入力ファセット フォーマットを設定してみてください。

文字列ストリームの入力および出力形式を「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);
}
于 2012-08-04T01:52:03.093 に答える