I'm experiencing a problem using custom formatting of fractional seconds.
const std::string date_string = "2006 Jun 01 999000 23.59.59";
const std::string format_string = "%Y %b %d %f %H.%M.%S";
When using a time_facet together with the "%f" flag, I get a correct output
containing a 6-digit number in place of the fractional part.
However, using a time_input_facet together with the "%f" flag, I cannot get
a correct ptime from an input using the same format as the above example.
The problem is twofold :
1) First, the input facet expects a leading '.'
otherwise, it parses a special value and fails.
[see time_facet.hpp(1035-1049)]
This is not the case in an output facet.
2) Second, even if I include a leading dot, the space
after the fractional seconds is not consumed, and
the parsing of the remainder fails.
This means that I need to add an extra space to the
input format string.
Here is a sample program:
---------
#include <cassert>
#include <boost/posix_time/posix_time.hpp>
Using namespace boost;
...
posix_time::ptime time;
const std::string input_format = "%Y %b %d %f %H.%M.%S"; // formats are
const std::string output_format = "%Y %b %d .%f %H.%M.%S"; // not symmetric
const std::string input_date_string = "2006 Jun 01 .999000 23.59.59";
std::string output_date_string;
{
posix_time::time_input_facet* input_facet =
new posix_time::time_input_facet(input_format.c_str());
std::istringstream in(input_date_string);
in.imbue(std::locale(std::locale::classic(), input_facet));
in >> time;
}
{
posix_time::time_facet* output_facet =
new posix_time::time_facet(output_format.c_str());
std::ostringstream out;
out.imbue(std::locale(std::locale::classic(), output_facet));
out << time;
output_date_string = out.str();
}
assert( output_date_string == input_date_string );
---------
Am I missing something ?
Thanks for your help.
Maxime LABELLE.