Răsfoiți Sursa

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

Guenter Obiltschnig 13 ani în urmă
părinte
comite
45fa903880

+ 8 - 1
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':

+ 12 - 1
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);