diff options
author | John Layt <jlayt@kde.org> | 2013-09-27 14:15:31 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-27 21:47:55 +0200 |
commit | 475cbed2446d0e3595e7b8ab71dcbc1ae5f59bcf (patch) | |
tree | 7f570d3f4bb8c3c2d9ff507cf996193a1881b447 /tests | |
parent | 3705c1263d4d2232d5527361692d25a8519c222b (diff) |
QDateTime - Fix round-trip of second occurrence times
At the Daylight Tme to Standard Time transition, the local time repeats
itself, i.e. 2am occurs twice. Qt's behavior when setting this using
the local time is ambiguous, as it depends on the system implementation
of mktime, which behaves differently on different platforms. Currently
this behavior remains undefined. When setting using an msecs or time_t
value however we can determine the correct instance to use and cache it
to ensure that any conversion back from local time to msecs is performed
consistantly on all platforms.
Note that caching this value will result in any calculations being wrong
should the system time zone change, or its rules change. This will be
fixed in Qt 5.3 when the system time zone change signal is implemented
and QDateTime switches to using QTimeZone instead of mktime to provide
consistnt behavior across platforms.
The QTimeZone spec does not require this fix as it already caches the
correct offset in setMSecsFromEpoch().
Change-Id: I799588db474e744a6d81e80f6a0442920569ebd3
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp | 30 |
1 files changed, 6 insertions, 24 deletions
diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index a282fcabd3..b8b970121c 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -2384,8 +2384,6 @@ void tst_QDateTime::daylightTransitions() const // 2011-10-30 03:00:00 CEST became 02:00:00 CET at msecs = 1319936400000 // 2012-03-25 02:00:00 CET became 03:00:00 CEST at msecs = 1332637200000 // 2012-10-28 03:00:00 CEST became 02:00:00 CET at msecs = 1351386000000 - const qint64 daylight2011 = 1301187600000; - const qint64 standard2011 = 1319936400000; const qint64 daylight2012 = 1332637200000; const qint64 standard2012 = 1351386000000; const qint64 msecsOneHour = 3600000; @@ -2535,10 +2533,6 @@ void tst_QDateTime::daylightTransitions() const QVERIFY(hourBefore.isValid()); QCOMPARE(hourBefore.date(), QDate(2012, 10, 28)); QCOMPARE(hourBefore.time(), QTime(2, 0, 0)); -#ifndef Q_OS_MAC - // Linux mktime bug uses last calculation - QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); -#endif // Q_OS_MAC QCOMPARE(hourBefore.toMSecsSinceEpoch(), standard2012 - msecsOneHour); // 1 msec before transition is 2:59:59.999 FirstOccurrence @@ -2546,7 +2540,6 @@ void tst_QDateTime::daylightTransitions() const QVERIFY(msecBefore.isValid()); QCOMPARE(msecBefore.date(), QDate(2012, 10, 28)); QCOMPARE(msecBefore.time(), QTime(2, 59, 59, 999)); - QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); QCOMPARE(msecBefore.toMSecsSinceEpoch(), standard2012 - 1); // At transition is 2:00:00 SecondOccurrence @@ -2554,10 +2547,6 @@ void tst_QDateTime::daylightTransitions() const QVERIFY(atTran.isValid()); QCOMPARE(atTran.date(), QDate(2012, 10, 28)); QCOMPARE(atTran.time(), QTime(2, 0, 0)); -#ifdef Q_OS_MAC - // Mac defaults to FirstOccurrence here - QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); -#endif // Q_OS_MAC QCOMPARE(atTran.toMSecsSinceEpoch(), standard2012); // 59:59.999 after transition is 2:59:59.999 SecondOccurrence @@ -2708,10 +2697,6 @@ void tst_QDateTime::daylightTransitions() const QVERIFY(test.isValid()); QCOMPARE(test.date(), QDate(2012, 10, 28)); QCOMPARE(test.time(), QTime(2, 0, 0)); -#ifdef Q_OS_WIN - // Windows uses SecondOccurrence - QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); -#endif // Q_OS_WIN QCOMPARE(test.toMSecsSinceEpoch(), standard2012 - msecsOneHour); // Add hour to tran FirstOccurrence to get to tran SecondOccurrence @@ -2724,11 +2709,10 @@ void tst_QDateTime::daylightTransitions() const QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); #endif // Q_OS_WIN QCOMPARE(test.time(), QTime(2, 0, 0)); -#ifndef Q_OS_MAC +#ifdef Q_OS_WIN // Windows uses SecondOccurrence - // Linux mktime bug uses last calculation QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); -#endif // Q_OS_MAC +#endif // Q_OS_WIN QCOMPARE(test.toMSecsSinceEpoch(), standard2012); // Add hour to tran SecondOccurrence to get to after tran FirstOccurrence @@ -2736,15 +2720,13 @@ void tst_QDateTime::daylightTransitions() const test = test.addMSecs(msecsOneHour); QVERIFY(test.isValid()); QCOMPARE(test.date(), QDate(2012, 10, 28)); -#ifndef Q_OS_WIN - // Mac uses FirstOccurrence - // Linux mktime bug uses last calculation +#ifdef Q_OS_MAC + // Mac uses FirstOccurrence, Windows uses SecondOccurrence, Linux uses last calculation QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); #endif // Q_OS_WIN QCOMPARE(test.time(), QTime(3, 0, 0)); -#ifndef Q_OS_WIN - // Mac uses FirstOccurrence - // Linux mktime bug uses last calculation +#ifdef Q_OS_MAC + // Mac uses FirstOccurrence, Windows uses SecondOccurrence, Linux uses last calculation QEXPECT_FAIL("", "QDateTime doesn't properly support Daylight Transitions", Continue); #endif // Q_OS_WIN QCOMPARE(test.toMSecsSinceEpoch(), standard2012 + msecsOneHour); |