Reputation: 155
I need to be able to transform and compare dates in c++. I found that the boost library pretty much suited my needs but I can´t get it to work correctly:
// 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!!
}
Basically I want to be able to subtract weeks (or months) of a local date and then compare the result with a date given as a string in YYYY-MM-DD format...
Upvotes: 4
Views: 2183
Reputation: 29209
Your locale might not be set to recognize dates in the YYYY-MM-DD format. Try setting the input facet format as in the Format Strings example.
Here's an example that shows how to set the input and output formats of a stringstream to "ISO extended":
#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);
}
Upvotes: 2