Boost logo

Boost Users :

From: Jeff Garland (jeff_at_[hidden])
Date: 2004-12-20 07:04:46


On Sun, 19 Dec 2004 22:22:46 -0800 (PST), Rakesh Kumar wrote
> Hi,
> I was going through the API to parse a date-time
> field. I came across the boost library regarding the
> same.
>
> #include "boost/date_time/posix_time/posix_time.hpp"
>
> using namespace boost::posix_time;
> #include <iostream>
> #include <cstdlib>
>
> using std::cout;
>
> int main() {
> std::string ts("2002-01-20 23:59:59.000");
> ptime t(time_from_string(ts));
>
> cout << to_simple_string(t);
> return EXIT_SUCCESS;
> }
>
> This example compiled fine and gave me the right
> results. But suppose if I have another date
> representation as follows.
>
> 06 Dec 2004 10:40:58.000
>
> If I enter the same string and try to parse from it,
> the method time_from_string aborts. I was wondering if
> there is any way I can tell time_from_string the
> format and try to parse from it.

Well, there isn't currently a way to tell from_string to do this directly.
However, you can use functions from the library to write your own parsing
routine. For example, the following handles the format you provided:

boost::posix_time::ptime
my_parse_time(const std::string& s)
{
  using namespace boost::gregorian;
  using namespace boost::posix_time;
  std::string date_part(s.substr(0,11));
  date d = from_uk_string(date_part); //expects day month year order
  std::string time_part(s.substr(12,12));
  time_duration td = duration_from_string(time_part);
  return ptime(d, td);
}

int
main()
{
  using namespace boost::posix_time;
  using namespace boost::gregorian;
  std::string ts("06 Dec 2004 23:59:59.000");
  try {
    ptime t = my_parse_time(ts);
    std::cout << to_simple_string(t) << std::endl;
  }
  catch(std::exception& e) {} // invalid time string
  return 0;

}

In the 1.33 release you will be able to pass a format to a facet class to
adjust how you want things parsed. It will look like this:

  std::stringstream ss("06 Dec 2004 23:59:59.000");
  time_facet* tf = new time_facet("%d %M %Y %H:%M:%s");
  ss.imbue(tf);
  ptime t; //not-a-date-time
  ss >> t;

Jeff


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net