Fix the datetime parsing to handle optional fractions of seconds

fix #3266
This commit is contained in:
louiz’
2017-05-23 11:46:14 +02:00
parent d1dc788279
commit 19ed2e7f5f
+14 -4
View File
@@ -26,8 +26,8 @@ std::time_t parse_datetime(const std::string& stamp)
std::istringstream ss(stamp); std::istringstream ss(stamp);
ss.imbue(std::locale("C")); ss.imbue(std::locale("C"));
std::string timezone; std::string remainings;
ss >> std::get_time(&t, format) >> timezone; ss >> std::get_time(&t, format) >> remainings;
if (ss.fail()) if (ss.fail())
return -1; return -1;
#else #else
@@ -36,12 +36,22 @@ std::time_t parse_datetime(const std::string& stamp)
if (!strptime(stamp.data(), format, &t)) { if (!strptime(stamp.data(), format, &t)) {
return -1; return -1;
} }
const std::string timezone(stamp.data() + stamp_size_without_tz); const std::string remainings(stamp.data() + stamp_size_without_tz);
#endif #endif
if (timezone.empty()) if (remainings.empty())
return -1; return -1;
std::string timezone;
// Skip optional fractions of seconds
if (remainings[0] == '.')
{
const auto pos = remainings.find_first_not_of(".0123456789");
timezone = remainings.substr(pos);
}
else
timezone = std::move(remainings);
if (timezone.compare(0, 1, "Z") != 0) if (timezone.compare(0, 1, "Z") != 0)
{ {
std::stringstream tz_ss; std::stringstream tz_ss;