mirror of
https://github.com/pocoproject/poco.git
synced 2025-03-29 02:45:21 +01:00
- fixed SF# 586: Poco::DateTimeParser and ISO8601 issues when seconds fraction has more than 6 digits
This commit is contained in:
parent
12b0255f58
commit
45fa903880
@ -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':
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user