mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-24 09:12:28 +02:00
- fixed SF# 586: Poco::DateTimeParser and ISO8601 issues when seconds fraction has more than 6 digits
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
//
|
||||
// DateTimeParser.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Foundation/src/DateTimeParser.cpp#3 $
|
||||
// $Id: //poco/1.4/Foundation/src/DateTimeParser.cpp#4 $
|
||||
//
|
||||
// Library: Foundation
|
||||
// Package: DateTime
|
||||
@@ -48,6 +48,10 @@ namespace Poco {
|
||||
while (it != end && !Ascii::isDigit(*it)) ++it
|
||||
|
||||
|
||||
#define SKIP_DIGITS() \
|
||||
while (it != end && Ascii::isDigit(*it)) ++it
|
||||
|
||||
|
||||
#define PARSE_NUMBER(var) \
|
||||
while (it != end && Ascii::isDigit(*it)) var = var*10 + ((*it++) - '0')
|
||||
|
||||
@@ -55,6 +59,7 @@ namespace Poco {
|
||||
#define PARSE_NUMBER_N(var, n) \
|
||||
{ int i = 0; while (i++ < n && it != end && Ascii::isDigit(*it)) var = var*10 + ((*it++) - '0'); }
|
||||
|
||||
|
||||
#define PARSE_FRACTIONAL_N(var, n) \
|
||||
{ int i = 0; while (i < n && it != end && Ascii::isDigit(*it)) { var = var*10 + ((*it++) - '0'); i++; } while (i++ < n) var *= 10; }
|
||||
|
||||
@@ -153,6 +158,7 @@ void DateTimeParser::parse(const std::string& fmt, const std::string& str, DateT
|
||||
++it;
|
||||
PARSE_FRACTIONAL_N(millis, 3);
|
||||
PARSE_FRACTIONAL_N(micros, 3);
|
||||
SKIP_DIGITS();
|
||||
}
|
||||
break;
|
||||
case 'i':
|
||||
@@ -168,6 +174,7 @@ void DateTimeParser::parse(const std::string& fmt, const std::string& str, DateT
|
||||
SKIP_JUNK();
|
||||
PARSE_FRACTIONAL_N(millis, 3);
|
||||
PARSE_FRACTIONAL_N(micros, 3);
|
||||
SKIP_DIGITS();
|
||||
break;
|
||||
case 'z':
|
||||
case 'Z':
|
||||
|
||||
Reference in New Issue
Block a user