Fix the datetime parsing to handle optional fractions of seconds
fix #3266
This commit is contained in:
+14
-4
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user