Check QDT's local time abbreviation as well as the qTzName()s
Since QDateTime uses some fall-backs if qTzName() doesn't give it something useful (as happens on MS-Win when local time is UTC), QDateTimeParser should check the result of those fall-backs as well as the qTzName()s when checking for local-time as zone. Change-Id: Ic809b7e44cd0c83fb076b24c27547268345fa379 Reviewed-by: Konrad Kujawa <konrad.kujawa@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> (cherry picked from commit c888e3922d73df791f0f31553536abf03b241a65) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
bd45bd2769
commit
89db6ceef0
@ -1183,13 +1183,18 @@ static QTime actualTime(QDateTimeParser::Sections known,
|
|||||||
/*
|
/*
|
||||||
\internal
|
\internal
|
||||||
*/
|
*/
|
||||||
static int startsWithLocalTimeZone(QStringView name)
|
static int startsWithLocalTimeZone(QStringView name, const QDateTime &when)
|
||||||
{
|
{
|
||||||
|
// On MS-Win, at least when system zone is UTC, the tzname[]s may be empty.
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
const QString zone(qTzName(i));
|
const QString zone(qTzName(i));
|
||||||
if (name.startsWith(zone))
|
if (!zone.isEmpty() && name.startsWith(zone))
|
||||||
return zone.size();
|
return zone.size();
|
||||||
}
|
}
|
||||||
|
// Mimic what QLocale::toString() would have used, to ensure round-trips work:
|
||||||
|
const QString local = QDateTime(when.date(), when.time()).timeZoneAbbreviation();
|
||||||
|
if (name.startsWith(local))
|
||||||
|
return local.size();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1235,14 +1240,13 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
|
|||||||
int *current = nullptr;
|
int *current = nullptr;
|
||||||
int zoneOffset; // Needed to serve as *current when setting zone
|
int zoneOffset; // Needed to serve as *current when setting zone
|
||||||
const SectionNode sn = sectionNodes.at(index);
|
const SectionNode sn = sectionNodes.at(index);
|
||||||
ParsedSection sect;
|
const QDateTime usedDateTime = ([=]() {
|
||||||
|
|
||||||
{
|
|
||||||
const QDate date = actualDate(isSet, calendar, year, year2digits,
|
const QDate date = actualDate(isSet, calendar, year, year2digits,
|
||||||
month, day, dayofweek);
|
month, day, dayofweek);
|
||||||
const QTime time = actualTime(isSet, hour, hour12, ampm, minute, second, msec);
|
const QTime time = actualTime(isSet, hour, hour12, ampm, minute, second, msec);
|
||||||
sect = parseSection(QDateTime(date, time, timeZone), index, pos);
|
return QDateTime(date, time, timeZone);
|
||||||
}
|
})();
|
||||||
|
ParsedSection sect = parseSection(usedDateTime, index, pos);
|
||||||
|
|
||||||
QDTPDEBUG << "sectionValue" << sn.name() << m_text
|
QDTPDEBUG << "sectionValue" << sn.name() << m_text
|
||||||
<< "pos" << pos << "used" << sect.used << stateName(sect.state);
|
<< "pos" << pos << "used" << sect.used << stateName(sect.state);
|
||||||
@ -1283,7 +1287,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const
|
|||||||
if (namedZone.isValid()) {
|
if (namedZone.isValid()) {
|
||||||
timeZone = namedZone;
|
timeZone = namedZone;
|
||||||
} else {
|
} else {
|
||||||
Q_ASSERT(startsWithLocalTimeZone(zoneName));
|
Q_ASSERT(startsWithLocalTimeZone(zoneName, usedDateTime));
|
||||||
timeZone = QTimeZone::LocalTime;
|
timeZone = QTimeZone::LocalTime;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -1793,7 +1797,7 @@ QDateTimeParser::ParsedSection QDateTimeParser::findUtcOffset(QStringView str, i
|
|||||||
QDateTimeParser::ParsedSection
|
QDateTimeParser::ParsedSection
|
||||||
QDateTimeParser::findTimeZoneName(QStringView str, const QDateTime &when) const
|
QDateTimeParser::findTimeZoneName(QStringView str, const QDateTime &when) const
|
||||||
{
|
{
|
||||||
const int systemLength = startsWithLocalTimeZone(str);
|
const int systemLength = startsWithLocalTimeZone(str, when);
|
||||||
#if QT_CONFIG(timezone)
|
#if QT_CONFIG(timezone)
|
||||||
// Collect up plausibly-valid characters; let QTimeZone work out what's
|
// Collect up plausibly-valid characters; let QTimeZone work out what's
|
||||||
// truly valid.
|
// truly valid.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user