diff options
Diffstat (limited to 'src/corelib/time/qdatetimeparser.cpp')
-rw-r--r-- | src/corelib/time/qdatetimeparser.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/corelib/time/qdatetimeparser.cpp b/src/corelib/time/qdatetimeparser.cpp index 0741ddcc57..d2375d258f 100644 --- a/src/corelib/time/qdatetimeparser.cpp +++ b/src/corelib/time/qdatetimeparser.cpp @@ -759,6 +759,11 @@ QDateTimeParser::parseSection(const QDateTime ¤tValue, int sectionIndex, i && m_text.at(offset) == QLatin1Char('-')); const int negativeYearOffset = negate ? 1 : 0; + // If the fields we've read thus far imply a time in a spring-forward, + // coerce to a nearby valid time: + const QDateTime defaultValue = currentValue.isValid() ? currentValue + : QDateTime::fromMSecsSinceEpoch(currentValue.toMSecsSinceEpoch()); + QStringView sectionTextRef = QStringView { m_text }.mid(offset + negativeYearOffset, sectionmaxsize); @@ -794,7 +799,7 @@ QDateTimeParser::parseSection(const QDateTime ¤tValue, int sectionIndex, i m_text.replace(offset, used, sectiontext.constData(), used); break; } case TimeZoneSection: - result = findTimeZone(sectionTextRef, currentValue, + result = findTimeZone(sectionTextRef, defaultValue, absoluteMax(sectionIndex), absoluteMin(sectionIndex)); break; @@ -806,7 +811,7 @@ QDateTimeParser::parseSection(const QDateTime ¤tValue, int sectionIndex, i int num = 0, used = 0; if (sn.type == MonthSection) { const QDate minDate = getMinimum().date(); - const int year = currentValue.date().year(calendar); + const int year = defaultValue.date().year(calendar); const int min = (year == minDate.year(calendar)) ? minDate.month(calendar) : 1; num = findMonth(sectiontext.toLower(), min, sectionIndex, year, §iontext, &used); } else { @@ -900,7 +905,7 @@ QDateTimeParser::parseSection(const QDateTime ¤tValue, int sectionIndex, i } } else if (unfilled && (fi & (FixedWidth | Numeric)) == (FixedWidth | Numeric)) { - if (skipToNextSection(sectionIndex, currentValue, digitsStr)) { + if (skipToNextSection(sectionIndex, defaultValue, digitsStr)) { const int missingZeroes = sectionmaxsize - digitsStr.size(); result = ParsedSection(Acceptable, last, sectionmaxsize, missingZeroes); m_text.insert(offset, QString(missingZeroes, QLatin1Char('0'))); |