Allow omitting month and day when parsing ISO date
This leaves only the year as mandatory component (other components can already be omitted).
This commit is contained in:
parent
73470d0b65
commit
c834f8923d
|
@ -119,6 +119,8 @@ DateTime DateTime::fromString(const char *str)
|
||||||
std::pair<DateTime, TimeSpan> DateTime::fromIsoString(const char *str)
|
std::pair<DateTime, TimeSpan> DateTime::fromIsoString(const char *str)
|
||||||
{
|
{
|
||||||
int values[9] = { 0 };
|
int values[9] = { 0 };
|
||||||
|
int *const yearIndex = values + 0;
|
||||||
|
int *const monthIndex = values + 1;
|
||||||
int *const dayIndex = values + 2;
|
int *const dayIndex = values + 2;
|
||||||
int *const hourIndex = values + 3;
|
int *const hourIndex = values + 3;
|
||||||
int *const secondsIndex = values + 5;
|
int *const secondsIndex = values + 5;
|
||||||
|
@ -178,7 +180,13 @@ std::pair<DateTime, TimeSpan> DateTime::fromIsoString(const char *str)
|
||||||
if (deltaNegative) {
|
if (deltaNegative) {
|
||||||
delta = TimeSpan(-delta.totalTicks());
|
delta = TimeSpan(-delta.totalTicks());
|
||||||
}
|
}
|
||||||
return make_pair(DateTime::fromDateAndTime(values[0], values[1], *dayIndex, *hourIndex, values[4], *secondsIndex, miliSeconds), delta);
|
if (valueIndex < monthIndex && !*monthIndex) {
|
||||||
|
*monthIndex = 1;
|
||||||
|
}
|
||||||
|
if (valueIndex < dayIndex && !*dayIndex) {
|
||||||
|
*dayIndex = 1;
|
||||||
|
}
|
||||||
|
return make_pair(DateTime::fromDateAndTime(*yearIndex, *monthIndex, *dayIndex, *hourIndex, values[4], *secondsIndex, miliSeconds), delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -171,6 +171,9 @@ void ChronoTests::testDateTime()
|
||||||
CPPUNIT_ASSERT_EQUAL(600, test5.first.nanosecond());
|
CPPUNIT_ASSERT_EQUAL(600, test5.first.nanosecond());
|
||||||
CPPUNIT_ASSERT_EQUAL("2017-08-23T19:40:15.9850776-02:30"s, test5.first.toIsoString(test5.second));
|
CPPUNIT_ASSERT_EQUAL("2017-08-23T19:40:15.9850776-02:30"s, test5.first.toIsoString(test5.second));
|
||||||
// test further variants
|
// test further variants
|
||||||
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("only year", DateTime::fromDate(2008), DateTime::fromIsoStringGmt("2008"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("only year and month", DateTime::fromDate(2008, 12), DateTime::fromIsoStringGmt("2008-12"));
|
||||||
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("only date", DateTime::fromDate(2008, 12, 5), DateTime::fromIsoStringGmt("2008-12-05"));
|
||||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("Zulu time", TimeSpan(), DateTime::fromIsoString("2017-08-23T19:40:15.985077682Z").second);
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("Zulu time", TimeSpan(), DateTime::fromIsoString("2017-08-23T19:40:15.985077682Z").second);
|
||||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("no minutes", TimeSpan::fromHours(3), DateTime::fromIsoString("2017-08-23T19:40:15.985077682+03").second);
|
CPPUNIT_ASSERT_EQUAL_MESSAGE("no minutes", TimeSpan::fromHours(3), DateTime::fromIsoString("2017-08-23T19:40:15.985077682+03").second);
|
||||||
const auto test6 = DateTime::fromIsoString("1970-01-01T01:02:03+01:00");
|
const auto test6 = DateTime::fromIsoString("1970-01-01T01:02:03+01:00");
|
||||||
|
|
Loading…
Reference in New Issue