Restore previous QDateTime behavior in DST gap
Historic QDateTime behavior when being asked to create a QDateTime in the DST gap was to interpret the given date as if it was in the time before that gap, mapping it to a point in time after the gap. This has changed with a04411119ead3d4473e4f0ac4bceedc585977b2f . Since then, the given date is interpreted as if it was in the time after the gap, thus being mapped to a point in time before the gap. This patch restores the historic behavior. This was not caught by Coin because machines ran in timezone "Atlantic/Reykjavik" which does not have DST since 1967. This patch changes tests to always run in "Europe/Oslo". Driveby: Test function "findSpring" did some operations in local time, even though being asked to work in a specific time zone. Fixed that. Fixes: QTBUG-86960 Fixes: QTBUG-89208 Change-Id: Iecce5898bf9711a10e7dfc0a25e4bbeaed1c8ade Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit 3d785249ba43cf4bd895ed679bac2791e0130dc5) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
69f7b6be72
commit
b8f9c649df
@ -2856,21 +2856,21 @@ static void refreshZonedDateTime(QDateTimeData &d, Qt::TimeSpec spec)
|
|||||||
qint64 epochMSecs = 0;
|
qint64 epochMSecs = 0;
|
||||||
QDate testDate;
|
QDate testDate;
|
||||||
QTime testTime;
|
QTime testTime;
|
||||||
if (spec == Qt::LocalTime) {
|
|
||||||
auto dstStatus = extractDaylightStatus(status);
|
auto dstStatus = extractDaylightStatus(status);
|
||||||
|
if (spec == Qt::LocalTime) {
|
||||||
epochMSecs = localMSecsToEpochMSecs(msecs, &dstStatus, &testDate, &testTime);
|
epochMSecs = localMSecsToEpochMSecs(msecs, &dstStatus, &testDate, &testTime);
|
||||||
status = mergeDaylightStatus(status, dstStatus);
|
|
||||||
#if QT_CONFIG(timezone)
|
#if QT_CONFIG(timezone)
|
||||||
// else spec == Qt::TimeZone, so check zone is valid:
|
// else spec == Qt::TimeZone, so check zone is valid:
|
||||||
} else if (d->m_timeZone.isValid()) {
|
} else if (d->m_timeZone.isValid()) {
|
||||||
epochMSecs = QDateTimePrivate::zoneMSecsToEpochMSecs(
|
epochMSecs = QDateTimePrivate::zoneMSecsToEpochMSecs(
|
||||||
msecs, d->m_timeZone, extractDaylightStatus(status), &testDate, &testTime);
|
msecs, d->m_timeZone, dstStatus, &testDate, &testTime);
|
||||||
#endif // timezone
|
#endif // timezone
|
||||||
} // else: testDate, testTime haven't been set, so are invalid.
|
} // else: testDate, testTime haven't been set, so are invalid.
|
||||||
// Cache the offset to use in offsetFromUtc() &c.
|
// Cache the offset to use in offsetFromUtc() &c.
|
||||||
offsetFromUtc = (msecs - epochMSecs) / 1000;
|
offsetFromUtc = (msecs - epochMSecs) / 1000;
|
||||||
if (testDate.isValid() && testTime.isValid()
|
if (testDate.isValid() && testTime.isValid()
|
||||||
&& timeToMSecs(testDate, testTime) == msecs) {
|
&& timeToMSecs(testDate, testTime) == msecs) {
|
||||||
|
status = mergeDaylightStatus(status, dstStatus);
|
||||||
status |= QDateTimePrivate::ValidDateTime;
|
status |= QDateTimePrivate::ValidDateTime;
|
||||||
} else {
|
} else {
|
||||||
status &= ~QDateTimePrivate::ValidDateTime;
|
status &= ~QDateTimePrivate::ValidDateTime;
|
||||||
|
@ -2821,6 +2821,9 @@ void tst_QDateTime::fromStringStringFormat()
|
|||||||
#endif
|
#endif
|
||||||
// OffsetFromUTC needs an offset check - we may as well do it for all:
|
// OffsetFromUTC needs an offset check - we may as well do it for all:
|
||||||
QCOMPARE(dt.offsetFromUtc(), expected.offsetFromUtc());
|
QCOMPARE(dt.offsetFromUtc(), expected.offsetFromUtc());
|
||||||
|
} else {
|
||||||
|
QCOMPARE(dt.isValid(), expected.isValid());
|
||||||
|
QCOMPARE(dt.toMSecsSinceEpoch(), expected.toMSecsSinceEpoch());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3245,6 +3248,8 @@ void tst_QDateTime::daylightTransitions() const
|
|||||||
QVERIFY(!missing.isValid());
|
QVERIFY(!missing.isValid());
|
||||||
QCOMPARE(missing.date(), QDate(2012, 3, 25));
|
QCOMPARE(missing.date(), QDate(2012, 3, 25));
|
||||||
QCOMPARE(missing.time(), QTime(2, 0));
|
QCOMPARE(missing.time(), QTime(2, 0));
|
||||||
|
// datetimeparser relies on toMSecsSinceEpoch to still work:
|
||||||
|
QCOMPARE(missing.toMSecsSinceEpoch(), daylight2012);
|
||||||
|
|
||||||
QDateTime after(QDate(2012, 3, 25), QTime(3, 0));
|
QDateTime after(QDate(2012, 3, 25), QTime(3, 0));
|
||||||
QVERIFY(after.isValid());
|
QVERIFY(after.isValid());
|
||||||
|
@ -4622,7 +4622,7 @@ static QDateTime findSpring(int year, const QTimeZone &timeZone)
|
|||||||
return QDateTime();
|
return QDateTime();
|
||||||
|
|
||||||
// Southern hemisphere spring is after midsummer
|
// Southern hemisphere spring is after midsummer
|
||||||
const QDateTime midSummer = QDate(year, 6, 21).startOfDay();
|
const QDateTime midSummer = QDate(year, 6, 21).startOfDay(timeZone);
|
||||||
const QTimeZone::OffsetData transition =
|
const QTimeZone::OffsetData transition =
|
||||||
midSummer.isDaylightTime() ? timeZone.previousTransition(midSummer)
|
midSummer.isDaylightTime() ? timeZone.previousTransition(midSummer)
|
||||||
: timeZone.nextTransition(midSummer);
|
: timeZone.nextTransition(midSummer);
|
||||||
@ -4744,7 +4744,7 @@ void tst_QDateTimeEdit::stepIntoDSTGap_data()
|
|||||||
QTest::addColumn<int>("steps");
|
QTest::addColumn<int>("steps");
|
||||||
QTest::addColumn<QDateTime>("end");
|
QTest::addColumn<QDateTime>("end");
|
||||||
|
|
||||||
const QTimeZone timeZone = QTimeZone::systemTimeZone();
|
const QTimeZone timeZone = QTimeZone("Europe/Oslo");
|
||||||
if (!timeZone.hasDaylightTime())
|
if (!timeZone.hasDaylightTime())
|
||||||
QSKIP("This test needs to run in a timezone that observes DST!");
|
QSKIP("This test needs to run in a timezone that observes DST!");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user