- fixed SF# 586: Poco::DateTimeParser and ISO8601 issues when seconds fraction has more than 6 digits

This commit is contained in:
Guenter Obiltschnig 2012-11-10 11:45:55 +01:00
parent 12b0255f58
commit 45fa903880
2 changed files with 20 additions and 2 deletions

View File

@ -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':

View File

@ -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);