diff --git a/Foundation/src/DateTimeParser.cpp b/Foundation/src/DateTimeParser.cpp index 64f0dd395..b7a553a1a 100644 --- a/Foundation/src/DateTimeParser.cpp +++ b/Foundation/src/DateTimeParser.cpp @@ -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': diff --git a/Foundation/testsuite/src/DateTimeParserTest.cpp b/Foundation/testsuite/src/DateTimeParserTest.cpp index 5d740ea9d..6bb706165 100644 --- a/Foundation/testsuite/src/DateTimeParserTest.cpp +++ b/Foundation/testsuite/src/DateTimeParserTest.cpp @@ -1,7 +1,7 @@ // // DateTimeParserTest.cpp // -// $Id: //poco/1.4/Foundation/testsuite/src/DateTimeParserTest.cpp#3 $ +// $Id: //poco/1.4/Foundation/testsuite/src/DateTimeParserTest.cpp#4 $ // // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. // and Contributors. @@ -198,6 +198,17 @@ void DateTimeParserTest::testISO8601Frac() assert (dt.microsecond() == 450); assert (tzd == -3600); + dt = DateTimeParser::parse(DateTimeFormat::ISO8601_FRAC_FORMAT, "2010-09-23T16:17:01.2817002+02:00", tzd); + assert (dt.year() == 2010); + assert (dt.month() == 9); + assert (dt.day() == 23); + assert (dt.hour() == 16); + assert (dt.minute() == 17); + assert (dt.second() == 1); + assert (dt.millisecond() == 281); + assert (dt.microsecond() == 700); + assert (tzd == 7200); + dt = DateTimeParser::parse(DateTimeFormat::ISO8601_FRAC_FORMAT, "2005-01-08T12:30:00", tzd); assert (dt.year() == 2005); assert (dt.month() == 1);