Boost logo

Boost :

Subject: [boost] What else shall I do before reuse a stringstream for date parsing?
From: Bill David (billdavidcn_at_[hidden])
Date: 2009-02-16 01:25:19


To accelerate date parsing, I have writen a class to encapsulate the date
parsing logic as following.
But the second call to CDateParser::parseDate(str) always failed to parse
the date string. What else shall I do before reuse the stringstream object?

#include <stdio.h>

#include <iostream>
#include <sstream>
using namespace std;

#include "boost/date_time/posix_time/posix_time.hpp"
using namespace boost::gregorian;
using namespace boost::posix_time;

class CDateParser
{
public:
    static void initialize();
    static time_t parseDate(const string& s);
private:
    static stringstream m_ss; //!< stringstream object used internally for
date parsing
};

stringstream CDateParser::m_ss;

time_t CDateParser::parseDate(const string& str)
{
    ptime p;
    m_ss.clear();
    m_ss << str;
    m_ss >> p;
    if (m_ss.fail()) {
        cout << "do not understand: " << str << endl;
        return 0;
    }

    tm t = to_tm(p);
    return mktime(&t);
}

void CDateParser::initialize() {
    time_input_facet* timefacet = new time_input_facet("%a, %d %b %Y
%H:%M:%S %z"); // will be automatically deleted by related locale object
    m_ss.imbue(locale(locale::empty(), timefacet));
}

int main() {
    CDateParser::initialize();

    string str;
    time_t t;

    str = "Fri, 18 Jul 2008 11:53:14 GMT";
    t = CDateParser::parseDate(str);
    cout << ctime(&t) << endl;

    str = "Sat, 19 Jul 2008 11:53:14 GMT";
    t = CDateParser::parseDate(str);
    cout << ctime(&t) << endl;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk