68{
69 std::string s(in);
70 std::replace(s.begin(), s.end(), 'T', ' ');
71
72 boost::posix_time::ptime t;
73
74
75 try
76 {
77 t = boost::posix_time::time_from_string(s);
78 }
79 catch (const std::exception& ex)
80 {
81 std::ostringstream text;
82 text << "cannot parse " << value << " = \'" << in << "\': \"" << ex.what() << "\" (ISO 8601 format (YYYY-MM-DD HH:MM:SS) is expected).";
83 throw std::runtime_error(text.str().c_str());
84 }
85
86
87
88 if (tz_ptr)
89 {
90 try
91 {
92 boost::local_time::local_date_time lt(t.date(), t.time_of_day(), tz_ptr, boost::local_time::local_date_time::EXCEPTION_ON_ERROR);
93 TLOG_DEBUG(1) <<
"Build zone\'s time \'" << in <<
"\' => \'" << lt.to_string() <<
"\' using \'" << tz_ptr->to_posix_string() <<
'\'' ;
94 t = lt.utc_time();
95 }
96 catch(std::exception& e)
97 {
98 std::ostringstream text;
99 text << "cannot parse " << value << " = \'" << in << "\' in time zone \"" << tz_ptr->to_posix_string() << "\": \"" << e.what() << '\"' << std::endl;
100 throw std::runtime_error(text.str().c_str());
101 }
102 }
103
104 return t;
105}
#define TLOG_DEBUG(lvl,...)