/* This file is part of the KDE libraries Copyright (c) 2005,2006,2010,2011 David Jarvie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include "moc_kdatetimetest.cpp" //TODO: test new methods QTEST_KDEMAIN_CORE(KDateTimeTest) extern KDECORE_EXPORT int KDateTime_utcCacheHit; extern KDECORE_EXPORT int KDateTime_zoneCacheHit; void KDateTimeTest::initTestCase() { cleanupTestCase(); mDataDir = QDir::homePath() + "/.kde-unit-test/kdatetimetest"; QVERIFY(QDir().mkpath(mDataDir)); QFile f; f.setFileName(mDataDir + QLatin1String("/zone.tab")); f.open(QIODevice::WriteOnly); QTextStream fStream(&f); fStream << "DE +5230+01322 Europe/Berlin\n" "EG +3003+03115 Africa/Cairo\n" "FR +4852+00220 Europe/Paris\n" "GB +512830-0001845 Europe/London Great Britain\n" "US +340308-1181434 America/Los_Angeles Pacific Time\n"; f.close(); QDir dir(mDataDir); QVERIFY(dir.mkdir("Africa")); QVERIFY(QFile::copy(QString::fromLatin1(KDESRCDIR) + QLatin1String("/Cairo"), mDataDir + QLatin1String("/Africa/Cairo"))); QVERIFY(dir.mkdir("America")); QVERIFY(QFile::copy(QString::fromLatin1(KDESRCDIR) + QLatin1String("/Los_Angeles"), mDataDir + QLatin1String("/America/Los_Angeles"))); QVERIFY(dir.mkdir("Europe")); QVERIFY(QFile::copy(QString::fromLatin1(KDESRCDIR) + QLatin1String("/Berlin"), mDataDir + QLatin1String("/Europe/Berlin"))); QVERIFY(QFile::copy(QString::fromLatin1(KDESRCDIR) + QLatin1String("/London"), mDataDir + QLatin1String("/Europe/London"))); QVERIFY(QFile::copy(QString::fromLatin1(KDESRCDIR) + QLatin1String("/Paris"), mDataDir + QLatin1String("/Europe/Paris"))); const QByteArray mDataDirBytes = mDataDir.toLocal8Bit(); ::setenv("KDE_ZONEINFO_DIR", mDataDirBytes.constData(), 1); ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); } void KDateTimeTest::cleanupTestCase() { removeDir(QLatin1String("kdatetimetest/Africa")); removeDir(QLatin1String("kdatetimetest/America")); removeDir(QLatin1String("kdatetimetest/Europe")); removeDir(QLatin1String("kdatetimetest")); ::unsetenv("TZ"); ::tzset(); } void KDateTimeTest::removeDir(const QString &subdir) { QDir local(QDir::homePath() + QLatin1String("/.kde-unit-test/") + subdir); foreach(const QString &file, local.entryList(QDir::Files)) if(!local.remove(file)) qWarning("%s: removing failed", qPrintable( file )); QCOMPARE((int)local.entryList(QDir::Files).count(), 0); local.cdUp(); QString subd = subdir; subd.remove(QRegExp("^.*/")); local.rmpath(subd); } //////////////////////////////////////////////////////////////////////// // KDateTime::Spec constructors and basic property information methods, // and the static convenience instances/methods. //////////////////////////////////////////////////////////////////////// void KDateTimeTest::specConstructors() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone losAngeles = KSystemTimeZones::zone("America/Los_Angeles"); const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":Europe/London", 1); ::tzset(); // Ensure that local time is different from UTC and different from 'london' ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Default constructor KDateTime::Spec invalid; QVERIFY(!invalid.isValid()); QCOMPARE(invalid.type(), KDateTime::Invalid); QVERIFY(!invalid.isLocalZone()); QVERIFY(!invalid.isUtc()); QVERIFY(!invalid.isOffsetFromUtc()); QVERIFY(!invalid.isClockTime()); QCOMPARE(invalid.utcOffset(), 0); QVERIFY(!invalid.timeZone().isValid()); // Time zone KDateTime::Spec tz(london); QVERIFY(tz.isValid()); QCOMPARE(tz.type(), KDateTime::TimeZone); QVERIFY(!tz.isUtc()); QVERIFY(!tz.isOffsetFromUtc()); QVERIFY(!tz.isLocalZone()); QVERIFY(!tz.isClockTime()); QCOMPARE(tz.utcOffset(), 0); QCOMPARE(tz.timeZone(), london); KDateTime::Spec tzLocal(losAngeles); QVERIFY(tzLocal.isValid()); QCOMPARE(tzLocal.type(), KDateTime::TimeZone); QCOMPARE(tzLocal, KDateTime::Spec(KDateTime::LocalZone)); QVERIFY(!tzLocal.isUtc()); QVERIFY(!tzLocal.isOffsetFromUtc()); QVERIFY(tzLocal.isLocalZone()); QVERIFY(!tzLocal.isClockTime()); QCOMPARE(tzLocal.utcOffset(), 0); QCOMPARE(tzLocal.timeZone(), losAngeles); // ... copy constructor KDateTime::Spec tzCopy(tz); QVERIFY(tzCopy.isValid()); QCOMPARE(tzCopy.type(), KDateTime::TimeZone); QVERIFY(!tzCopy.isUtc()); QVERIFY(!tzCopy.isOffsetFromUtc()); QVERIFY(!tzCopy.isLocalZone()); QVERIFY(!tzCopy.isClockTime()); QCOMPARE(tzCopy.utcOffset(), 0); QCOMPARE(tzCopy.timeZone(), london); // Local time zone KDateTime::Spec local(KDateTime::LocalZone); QVERIFY(local.isValid()); QCOMPARE(local.type(), KDateTime::TimeZone); QCOMPARE(local, KDateTime::Spec(KDateTime::LocalZone)); QVERIFY(!local.isUtc()); QVERIFY(!local.isOffsetFromUtc()); QVERIFY(local.isLocalZone()); QVERIFY(!local.isClockTime()); QCOMPARE(local.utcOffset(), 0); QCOMPARE(local.timeZone(), KSystemTimeZones::local()); KDateTime::Spec localx(KDateTime::Spec(KDateTime::LocalZone, 2*3600)); QVERIFY(localx.isValid()); QCOMPARE(localx.type(), KDateTime::TimeZone); QCOMPARE(localx, KDateTime::Spec(KDateTime::LocalZone)); QVERIFY(!localx.isUtc()); QVERIFY(!localx.isOffsetFromUtc()); QVERIFY(localx.isLocalZone()); QVERIFY(!localx.isClockTime()); QCOMPARE(localx.utcOffset(), 0); QCOMPARE(localx.timeZone(), KSystemTimeZones::local()); KDateTime::Spec local2 = KDateTime::Spec::LocalZone(); QVERIFY(local2.isValid()); QCOMPARE(local2.type(), KDateTime::TimeZone); QCOMPARE(local2, KDateTime::Spec(KDateTime::LocalZone)); QVERIFY(!local2.isUtc()); QVERIFY(!local2.isOffsetFromUtc()); QVERIFY(local2.isLocalZone()); QVERIFY(!local2.isClockTime()); QCOMPARE(local2.utcOffset(), 0); QCOMPARE(local2.timeZone(), KSystemTimeZones::local()); // ... copy constructor KDateTime::Spec localCopy(local); QVERIFY(localCopy.isValid()); QCOMPARE(localCopy.type(), KDateTime::TimeZone); QCOMPARE(localCopy, KDateTime::Spec(KDateTime::LocalZone)); QVERIFY(!localCopy.isUtc()); QVERIFY(!localCopy.isOffsetFromUtc()); QVERIFY(localCopy.isLocalZone()); QVERIFY(!localCopy.isClockTime()); QCOMPARE(localCopy.utcOffset(), 0); QCOMPARE(localCopy.timeZone(), losAngeles); // UTC KDateTime::Spec utc(KDateTime::UTC); QVERIFY(utc.isValid()); QCOMPARE(utc.type(), KDateTime::UTC); QVERIFY(utc.isUtc()); QVERIFY(!utc.isOffsetFromUtc()); QVERIFY(!utc.isLocalZone()); QVERIFY(!utc.isClockTime()); QCOMPARE(utc.utcOffset(), 0); QCOMPARE(utc.timeZone(), KTimeZone::utc()); KDateTime::Spec utcx(KDateTime::UTC, 2*3600); QVERIFY(utcx.isValid()); QCOMPARE(utcx.type(), KDateTime::UTC); QVERIFY(utcx.isUtc()); QVERIFY(!utcx.isOffsetFromUtc()); QVERIFY(!utcx.isLocalZone()); QVERIFY(!utcx.isClockTime()); QCOMPARE(utcx.utcOffset(), 0); QCOMPARE(utcx.timeZone(), KTimeZone::utc()); const KDateTime::Spec& utc2 = KDateTime::Spec::UTC(); QVERIFY(utc2.isValid()); QCOMPARE(utc2.type(), KDateTime::UTC); QVERIFY(utc2.isUtc()); QVERIFY(!utc2.isOffsetFromUtc()); QVERIFY(!utc2.isLocalZone()); QVERIFY(!utc2.isClockTime()); QCOMPARE(utc2.utcOffset(), 0); QCOMPARE(utc2.timeZone(), KTimeZone::utc()); // ... copy constructor KDateTime::Spec utcCopy(utc); QVERIFY(utcCopy.isValid()); QCOMPARE(utcCopy.type(), KDateTime::UTC); QVERIFY(utcCopy.isUtc()); QVERIFY(!utcCopy.isOffsetFromUtc()); QVERIFY(!utcCopy.isLocalZone()); QVERIFY(!utcCopy.isClockTime()); QCOMPARE(utcCopy.utcOffset(), 0); QCOMPARE(utcCopy.timeZone(), KTimeZone::utc()); // Offset from UTC KDateTime::Spec offset0(KDateTime::OffsetFromUTC); QVERIFY(offset0.isValid()); QCOMPARE(offset0.type(), KDateTime::OffsetFromUTC); QVERIFY(offset0.isUtc()); QVERIFY(offset0.isOffsetFromUtc()); QVERIFY(!offset0.isLocalZone()); QVERIFY(!offset0.isClockTime()); QCOMPARE(offset0.utcOffset(), 0); QVERIFY(!offset0.timeZone().isValid()); KDateTime::Spec offset(KDateTime::Spec(KDateTime::OffsetFromUTC, -2*3600)); QVERIFY(offset.isValid()); QCOMPARE(offset.type(), KDateTime::OffsetFromUTC); QVERIFY(!offset.isUtc()); QVERIFY(offset.isOffsetFromUtc()); QVERIFY(!offset.isLocalZone()); QVERIFY(!offset.isClockTime()); QCOMPARE(offset.utcOffset(), -2*3600); QVERIFY(!offset.timeZone().isValid()); KDateTime::Spec offset2 = KDateTime::Spec::OffsetFromUTC(2*3600); QVERIFY(offset2.isValid()); QCOMPARE(offset2.type(), KDateTime::OffsetFromUTC); QVERIFY(!offset2.isUtc()); QVERIFY(offset2.isOffsetFromUtc()); QVERIFY(!offset2.isLocalZone()); QVERIFY(!offset2.isClockTime()); QCOMPARE(offset2.utcOffset(), 2*3600); QVERIFY(!offset2.timeZone().isValid()); // ... copy constructor KDateTime::Spec offsetCopy(offset); QVERIFY(offsetCopy.isValid()); QCOMPARE(offsetCopy.type(), KDateTime::OffsetFromUTC); QVERIFY(!offsetCopy.isUtc()); QVERIFY(offsetCopy.isOffsetFromUtc()); QVERIFY(!offsetCopy.isLocalZone()); QVERIFY(!offsetCopy.isClockTime()); QCOMPARE(offsetCopy.utcOffset(), -2*3600); QVERIFY(!offsetCopy.timeZone().isValid()); // Local clock time KDateTime::Spec clock(KDateTime::ClockTime); QVERIFY(clock.isValid()); QCOMPARE(clock.type(), KDateTime::ClockTime); QVERIFY(!clock.isUtc()); QVERIFY(!clock.isOffsetFromUtc()); QVERIFY(!clock.isLocalZone()); QVERIFY(clock.isClockTime()); QCOMPARE(clock.utcOffset(), 0); QVERIFY(!clock.timeZone().isValid()); KDateTime::Spec clockx(KDateTime::Spec(KDateTime::ClockTime, 2*3600)); QVERIFY(clockx.isValid()); QCOMPARE(clockx.type(), KDateTime::ClockTime); QVERIFY(!clockx.isUtc()); QVERIFY(!clockx.isOffsetFromUtc()); QVERIFY(!clockx.isLocalZone()); QVERIFY(clockx.isClockTime()); QCOMPARE(clockx.utcOffset(), 0); QVERIFY(!clockx.timeZone().isValid()); KDateTime::Spec clock2 = KDateTime::Spec::ClockTime(); QVERIFY(clock2.isValid()); QCOMPARE(clock2.type(), KDateTime::ClockTime); QVERIFY(!clock2.isUtc()); QVERIFY(!clock2.isOffsetFromUtc()); QVERIFY(!clock2.isLocalZone()); QVERIFY(clock2.isClockTime()); QCOMPARE(clock2.utcOffset(), 0); QVERIFY(!clock2.timeZone().isValid()); // ... copy constructor KDateTime::Spec clockCopy(clock); QVERIFY(clockCopy.isValid()); QCOMPARE(clockCopy.type(), KDateTime::ClockTime); QVERIFY(!clockCopy.isUtc()); QVERIFY(!clockCopy.isOffsetFromUtc()); QVERIFY(!clockCopy.isLocalZone()); QVERIFY(clockCopy.isClockTime()); QCOMPARE(clockCopy.utcOffset(), 0); QVERIFY(!clockCopy.timeZone().isValid()); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } //////////////////////////////////////////////////////////////////////// // KDateTime::Spec setType(), operator==(), etc. //////////////////////////////////////////////////////////////////////// void KDateTimeTest::specSet() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone losAngeles = KSystemTimeZones::zone("America/Los_Angeles"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); KDateTime::Spec spec; QCOMPARE(spec.type(), KDateTime::Invalid); spec.setType(KDateTime::OffsetFromUTC, 7200); QCOMPARE(spec.type(), KDateTime::OffsetFromUTC); QVERIFY(spec.equivalentTo(KDateTime::Spec::OffsetFromUTC(7200))); QVERIFY(!spec.equivalentTo(KDateTime::Spec::OffsetFromUTC(0))); QVERIFY(spec == KDateTime::Spec::OffsetFromUTC(7200)); QVERIFY(!(spec != KDateTime::Spec::OffsetFromUTC(7200))); QVERIFY(spec != KDateTime::Spec::OffsetFromUTC(-7200)); QVERIFY(spec != KDateTime::Spec(london)); spec.setType(KDateTime::OffsetFromUTC, 0); QCOMPARE(spec.type(), KDateTime::OffsetFromUTC); QVERIFY(spec.equivalentTo(KDateTime::Spec::OffsetFromUTC(0))); QVERIFY(spec.equivalentTo(KDateTime::Spec::UTC())); QVERIFY(!spec.equivalentTo(KDateTime::Spec::OffsetFromUTC(7200))); QVERIFY(spec == KDateTime::Spec::OffsetFromUTC(0)); QVERIFY(!(spec != KDateTime::Spec::OffsetFromUTC(0))); QVERIFY(spec != KDateTime::Spec::OffsetFromUTC(-7200)); QVERIFY(spec != KDateTime::Spec(london)); spec.setType(london); QCOMPARE(spec.type(), KDateTime::TimeZone); QVERIFY(spec.equivalentTo(KDateTime::Spec(london))); QVERIFY(spec == KDateTime::Spec(london)); QVERIFY(!(spec != KDateTime::Spec(london))); QVERIFY(spec != KDateTime::Spec::OffsetFromUTC(0)); QVERIFY(!spec.equivalentTo(KDateTime::Spec::OffsetFromUTC(0))); spec.setType(KDateTime::LocalZone); QCOMPARE(spec.type(), KDateTime::TimeZone); QVERIFY(spec.equivalentTo(KDateTime::Spec::LocalZone())); QVERIFY(spec == KDateTime::Spec::LocalZone()); QVERIFY(!(spec != KDateTime::Spec::LocalZone())); QVERIFY(spec.equivalentTo(KDateTime::Spec(losAngeles))); QVERIFY(spec == KDateTime::Spec(losAngeles)); QVERIFY(spec != KDateTime::Spec(london)); QVERIFY(!spec.equivalentTo(KDateTime::Spec(london))); spec.setType(KDateTime::UTC); QCOMPARE(spec.type(), KDateTime::UTC); QVERIFY(spec.equivalentTo(KDateTime::Spec::UTC())); QVERIFY(spec == KDateTime::Spec::UTC()); QVERIFY(!(spec != KDateTime::Spec::UTC())); QVERIFY(spec != KDateTime::Spec::LocalZone()); QVERIFY(!spec.equivalentTo(KDateTime::Spec::LocalZone())); QVERIFY(spec.equivalentTo(KDateTime::Spec::OffsetFromUTC(0))); spec.setType(KDateTime::ClockTime); QCOMPARE(spec.type(), KDateTime::ClockTime); QVERIFY(spec.equivalentTo(KDateTime::Spec::ClockTime())); QVERIFY(spec == KDateTime::Spec::ClockTime()); QVERIFY(!(spec != KDateTime::Spec::ClockTime())); QVERIFY(spec != KDateTime::Spec::UTC()); QVERIFY(!spec.equivalentTo(KDateTime::Spec::UTC())); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } ////////////////////////////////////////////////////// // Constructors and basic property information methods ////////////////////////////////////////////////////// void KDateTimeTest::constructors() { QDate d(2001,2,13); QTime t(3,45,14); QDateTime dtLocal(d, t, Qt::LocalTime); QDateTime dtUTC(d, t, Qt::UTC); KTimeZone london = KSystemTimeZones::zone("Europe/London"); const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":Europe/London", 1); ::tzset(); QDateTime dtUTCtoLondon = dtUTC.toLocalTime(); // Ensure that local time is different from UTC and different from 'london' ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Default constructor KDateTime deflt; QVERIFY(deflt.isNull()); QVERIFY(!deflt.isValid()); // No time zone or timeSpec explicitly specified KDateTime datetimeL(dtLocal); QVERIFY(!datetimeL.isNull()); QVERIFY(datetimeL.isValid()); QVERIFY(!datetimeL.isDateOnly()); QCOMPARE(datetimeL.timeType(), KDateTime::TimeZone); QCOMPARE(datetimeL.timeSpec(), KDateTime::Spec::LocalZone()); QVERIFY(datetimeL.isLocalZone()); QVERIFY(!datetimeL.isUtc()); QVERIFY(!datetimeL.isOffsetFromUtc()); QVERIFY(!datetimeL.isClockTime()); QCOMPARE(datetimeL.utcOffset(), -8*3600); QCOMPARE(datetimeL.timeZone(), KSystemTimeZones::local()); QCOMPARE(datetimeL.dateTime(), dtLocal); KDateTime datetimeU(dtUTC); QVERIFY(!datetimeU.isNull()); QVERIFY(datetimeU.isValid()); QVERIFY(!datetimeU.isDateOnly()); QCOMPARE(datetimeU.timeType(), KDateTime::UTC); QVERIFY(!datetimeU.isLocalZone()); QVERIFY(datetimeU.isUtc()); QVERIFY(!datetimeU.isOffsetFromUtc()); QVERIFY(!datetimeU.isClockTime()); QCOMPARE(datetimeU.utcOffset(), 0); QCOMPARE(datetimeU.timeZone(), KTimeZone::utc()); QCOMPARE(datetimeU.dateTime(), dtUTC); // Time zone KDateTime dateTz(d, london); QVERIFY(!dateTz.isNull()); QVERIFY(dateTz.isValid()); QVERIFY(dateTz.isDateOnly()); QCOMPARE(dateTz.timeType(), KDateTime::TimeZone); QVERIFY(!dateTz.isUtc()); QVERIFY(!dateTz.isOffsetFromUtc()); QVERIFY(!dateTz.isLocalZone()); QVERIFY(!dateTz.isClockTime()); QCOMPARE(dateTz.utcOffset(), 0); QCOMPARE(dateTz.timeZone(), london); QCOMPARE(dateTz.dateTime(), QDateTime(d, QTime(0,0,0), Qt::LocalTime)); QCOMPARE(dateTz.date(), d); KDateTime dateTimeTz(d, QTime(3,45,14), london); QVERIFY(!dateTimeTz.isNull()); QVERIFY(dateTimeTz.isValid()); QVERIFY(!dateTimeTz.isDateOnly()); QCOMPARE(dateTimeTz.timeType(), KDateTime::TimeZone); QVERIFY(!dateTimeTz.isUtc()); QVERIFY(!dateTimeTz.isOffsetFromUtc()); QVERIFY(!dateTimeTz.isLocalZone()); QVERIFY(!dateTimeTz.isClockTime()); QCOMPARE(dateTimeTz.utcOffset(), 0); QCOMPARE(dateTimeTz.timeZone(), london); QCOMPARE(dateTimeTz.dateTime(), QDateTime(d, QTime(3,45,14), Qt::LocalTime)); QCOMPARE(dateTimeTz.time(), QTime(3,45,14)); KDateTime datetimeTz(dtLocal, london); QVERIFY(!datetimeTz.isNull()); QVERIFY(datetimeTz.isValid()); QVERIFY(!dateTimeTz.isDateOnly()); QCOMPARE(datetimeTz.timeType(), KDateTime::TimeZone); QVERIFY(!datetimeTz.isUtc()); QVERIFY(!datetimeTz.isOffsetFromUtc()); QVERIFY(!datetimeTz.isLocalZone()); QVERIFY(!datetimeTz.isClockTime()); QCOMPARE(datetimeTz.utcOffset(), 0); QCOMPARE(datetimeTz.timeZone(), london); QCOMPARE(datetimeTz.dateTime(), dtLocal); KDateTime datetimeTz2(dtUTC, london); QVERIFY(!datetimeTz2.isNull()); QVERIFY(datetimeTz2.isValid()); QVERIFY(!dateTimeTz.isDateOnly()); QCOMPARE(datetimeTz2.timeType(), KDateTime::TimeZone); QVERIFY(!datetimeTz2.isUtc()); QVERIFY(!datetimeTz2.isOffsetFromUtc()); QVERIFY(!datetimeTz2.isLocalZone()); QVERIFY(!datetimeTz2.isClockTime()); QCOMPARE(datetimeTz2.utcOffset(), 0); QCOMPARE(datetimeTz2.timeZone(), london); QCOMPARE(datetimeTz2.dateTime(), dtUTCtoLondon); // ... copy constructor KDateTime datetimeTzCopy(datetimeTz); QVERIFY(!datetimeTzCopy.isNull()); QVERIFY(datetimeTzCopy.isValid()); QVERIFY(!dateTimeTz.isDateOnly()); QCOMPARE(datetimeTzCopy.timeType(), KDateTime::TimeZone); QVERIFY(!datetimeTzCopy.isUtc()); QVERIFY(!datetimeTzCopy.isOffsetFromUtc()); QVERIFY(!datetimeTzCopy.isLocalZone()); QVERIFY(!datetimeTzCopy.isClockTime()); QCOMPARE(datetimeTzCopy.utcOffset(), 0); QCOMPARE(datetimeTzCopy.timeZone(), datetimeTz.timeZone()); QCOMPARE(datetimeTzCopy.dateTime(), datetimeTz.dateTime()); // UTC KDateTime date_UTC(d, KDateTime::Spec::UTC()); QVERIFY(!date_UTC.isNull()); QVERIFY(date_UTC.isValid()); QVERIFY(date_UTC.isDateOnly()); QCOMPARE(date_UTC.timeType(), KDateTime::UTC); QVERIFY(date_UTC.isUtc()); QVERIFY(!date_UTC.isOffsetFromUtc()); QVERIFY(!date_UTC.isLocalZone()); QVERIFY(!date_UTC.isClockTime()); QCOMPARE(date_UTC.utcOffset(), 0); QCOMPARE(date_UTC.timeZone(), KTimeZone::utc()); QCOMPARE(date_UTC.dateTime(), QDateTime(d, QTime(0,0,0), Qt::UTC)); KDateTime dateTime_UTC(d, t, KDateTime::UTC); QVERIFY(!dateTime_UTC.isNull()); QVERIFY(dateTime_UTC.isValid()); QVERIFY(!dateTime_UTC.isDateOnly()); QCOMPARE(dateTime_UTC.timeType(), KDateTime::UTC); QVERIFY(dateTime_UTC.isUtc()); QVERIFY(!dateTime_UTC.isOffsetFromUtc()); QVERIFY(!dateTime_UTC.isLocalZone()); QVERIFY(!dateTime_UTC.isClockTime()); QCOMPARE(dateTime_UTC.utcOffset(), 0); QCOMPARE(dateTime_UTC.timeZone(), KTimeZone::utc()); QCOMPARE(dateTime_UTC.dateTime(), QDateTime(d, t, Qt::UTC)); KDateTime datetime_UTC(dtLocal, KDateTime::UTC); QVERIFY(!datetime_UTC.isNull()); QVERIFY(datetime_UTC.isValid()); QVERIFY(!datetime_UTC.isDateOnly()); QCOMPARE(datetime_UTC.timeType(), KDateTime::UTC); QVERIFY(datetime_UTC.isUtc()); QVERIFY(!datetime_UTC.isOffsetFromUtc()); QVERIFY(!datetime_UTC.isLocalZone()); QVERIFY(!datetime_UTC.isClockTime()); QCOMPARE(datetime_UTC.utcOffset(), 0); QCOMPARE(datetime_UTC.timeZone(), KTimeZone::utc()); QCOMPARE(datetime_UTC.dateTime(), dtLocal.toUTC()); KDateTime datetime_UTC2(dtUTC, KDateTime::UTC); QVERIFY(!datetime_UTC2.isNull()); QVERIFY(datetime_UTC2.isValid()); QVERIFY(!datetime_UTC2.isDateOnly()); QCOMPARE(datetime_UTC2.timeType(), KDateTime::UTC); QVERIFY(datetime_UTC2.isUtc()); QVERIFY(!datetime_UTC2.isOffsetFromUtc()); QVERIFY(!datetime_UTC2.isLocalZone()); QVERIFY(!datetime_UTC2.isClockTime()); QCOMPARE(datetime_UTC2.utcOffset(), 0); QCOMPARE(datetime_UTC2.timeZone(), KTimeZone::utc()); QCOMPARE(datetime_UTC2.dateTime(), dtUTC); QCOMPARE(datetime_UTC2.date(), dtUTC.date()); QCOMPARE(datetime_UTC2.time(), dtUTC.time()); // ... copy constructor KDateTime datetime_UTCCopy(datetime_UTC); QVERIFY(!datetime_UTCCopy.isNull()); QVERIFY(datetime_UTCCopy.isValid()); QVERIFY(!datetime_UTCCopy.isDateOnly()); QCOMPARE(datetime_UTCCopy.timeType(), KDateTime::UTC); QVERIFY(datetime_UTCCopy.isUtc()); QVERIFY(!datetime_UTCCopy.isOffsetFromUtc()); QVERIFY(!datetime_UTCCopy.isLocalZone()); QVERIFY(!datetime_UTCCopy.isClockTime()); QCOMPARE(datetime_UTCCopy.utcOffset(), 0); QCOMPARE(datetime_UTCCopy.timeZone(), datetime_UTC.timeZone()); QCOMPARE(datetime_UTCCopy.dateTime(), datetime_UTC.dateTime()); // Offset from UTC KDateTime date_OffsetFromUTC(d, KDateTime::Spec::OffsetFromUTC(-2*3600)); QVERIFY(!date_OffsetFromUTC.isNull()); QVERIFY(date_OffsetFromUTC.isValid()); QVERIFY(date_OffsetFromUTC.isDateOnly()); QCOMPARE(date_OffsetFromUTC.timeType(), KDateTime::OffsetFromUTC); QVERIFY(!date_OffsetFromUTC.isUtc()); QVERIFY(date_OffsetFromUTC.isOffsetFromUtc()); QVERIFY(!date_OffsetFromUTC.isLocalZone()); QVERIFY(!date_OffsetFromUTC.isClockTime()); QCOMPARE(date_OffsetFromUTC.utcOffset(), -2*3600); QVERIFY(!date_OffsetFromUTC.timeZone().isValid()); QCOMPARE(date_OffsetFromUTC.dateTime(), QDateTime(d, QTime(0,0,0), Qt::LocalTime)); KDateTime dateTime_OffsetFromUTC(d, t, KDateTime::Spec::OffsetFromUTC(2*3600)); QVERIFY(!dateTime_OffsetFromUTC.isNull()); QVERIFY(dateTime_OffsetFromUTC.isValid()); QVERIFY(!dateTime_OffsetFromUTC.isDateOnly()); QCOMPARE(dateTime_OffsetFromUTC.timeType(), KDateTime::OffsetFromUTC); QVERIFY(!dateTime_OffsetFromUTC.isUtc()); QVERIFY(dateTime_OffsetFromUTC.isOffsetFromUtc()); QVERIFY(!dateTime_OffsetFromUTC.isLocalZone()); QVERIFY(!dateTime_OffsetFromUTC.isClockTime()); QCOMPARE(dateTime_OffsetFromUTC.utcOffset(), 2*3600); QVERIFY(!dateTime_OffsetFromUTC.timeZone().isValid()); QCOMPARE(dateTime_OffsetFromUTC.dateTime(), QDateTime(d, t, Qt::LocalTime)); KDateTime datetime_OffsetFromUTC(dtLocal, KDateTime::Spec::OffsetFromUTC(-2*3600)); QVERIFY(!datetime_OffsetFromUTC.isNull()); QVERIFY(datetime_OffsetFromUTC.isValid()); QVERIFY(!datetime_OffsetFromUTC.isDateOnly()); QCOMPARE(datetime_OffsetFromUTC.timeType(), KDateTime::OffsetFromUTC); QVERIFY(!datetime_OffsetFromUTC.isUtc()); QVERIFY(datetime_OffsetFromUTC.isOffsetFromUtc()); QVERIFY(!datetime_OffsetFromUTC.isLocalZone()); QVERIFY(!datetime_OffsetFromUTC.isClockTime()); QCOMPARE(datetime_OffsetFromUTC.utcOffset(), -2*3600); QVERIFY(!datetime_OffsetFromUTC.timeZone().isValid()); QCOMPARE(datetime_OffsetFromUTC.dateTime(), dtLocal); QCOMPARE(datetime_OffsetFromUTC.date(), dtLocal.date()); QCOMPARE(datetime_OffsetFromUTC.time(), dtLocal.time()); KDateTime datetime_OffsetFromUTC2(dtUTC, KDateTime::Spec::OffsetFromUTC(2*3600)); QVERIFY(!datetime_OffsetFromUTC2.isNull()); QVERIFY(datetime_OffsetFromUTC2.isValid()); QVERIFY(!datetime_OffsetFromUTC2.isDateOnly()); QCOMPARE(datetime_OffsetFromUTC2.timeType(), KDateTime::OffsetFromUTC); QVERIFY(!datetime_OffsetFromUTC2.isUtc()); QVERIFY(datetime_OffsetFromUTC2.isOffsetFromUtc()); QVERIFY(!datetime_OffsetFromUTC2.isLocalZone()); QVERIFY(!datetime_OffsetFromUTC2.isClockTime()); QCOMPARE(datetime_OffsetFromUTC2.utcOffset(), 2*3600); QVERIFY(!datetime_OffsetFromUTC2.timeZone().isValid()); QDateTime dtof = dtUTC.addSecs(2*3600); dtof.setTimeSpec(Qt::LocalTime); QCOMPARE(datetime_OffsetFromUTC2.dateTime(), dtof); // ... copy constructor KDateTime datetime_OffsetFromUTCCopy(datetime_OffsetFromUTC); QVERIFY(!datetime_OffsetFromUTCCopy.isNull()); QVERIFY(datetime_OffsetFromUTCCopy.isValid()); QVERIFY(!datetime_OffsetFromUTCCopy.isDateOnly()); QCOMPARE(datetime_OffsetFromUTCCopy.timeType(), KDateTime::OffsetFromUTC); QVERIFY(!datetime_OffsetFromUTCCopy.isUtc()); QVERIFY(datetime_OffsetFromUTCCopy.isOffsetFromUtc()); QVERIFY(!datetime_OffsetFromUTCCopy.isLocalZone()); QVERIFY(!datetime_OffsetFromUTCCopy.isClockTime()); QCOMPARE(datetime_OffsetFromUTCCopy.utcOffset(), -2*3600); QVERIFY(!datetime_OffsetFromUTCCopy.timeZone().isValid()); QCOMPARE(datetime_OffsetFromUTCCopy.dateTime(), datetime_OffsetFromUTC.dateTime()); // Local time zone KDateTime date_LocalZone(d, KDateTime::Spec::LocalZone()); QVERIFY(!date_LocalZone.isNull()); QVERIFY(date_LocalZone.isValid()); QVERIFY(date_LocalZone.isDateOnly()); QCOMPARE(date_LocalZone.timeType(), KDateTime::TimeZone); QCOMPARE(date_LocalZone.timeSpec(), KDateTime::Spec::LocalZone()); QVERIFY(!date_LocalZone.isUtc()); QVERIFY(!date_LocalZone.isOffsetFromUtc()); QVERIFY(date_LocalZone.isLocalZone()); QVERIFY(!date_LocalZone.isClockTime()); QCOMPARE(date_LocalZone.utcOffset(), -8*3600); QCOMPARE(date_LocalZone.timeZone(), KSystemTimeZones::local()); QCOMPARE(date_LocalZone.dateTime(), QDateTime(d, QTime(0,0,0), Qt::LocalTime)); KDateTime dateTime_LocalZone(d, t, KDateTime::LocalZone); QVERIFY(!dateTime_LocalZone.isNull()); QVERIFY(dateTime_LocalZone.isValid()); QVERIFY(!dateTime_LocalZone.isDateOnly()); QCOMPARE(dateTime_LocalZone.timeType(), KDateTime::TimeZone); QCOMPARE(dateTime_LocalZone.timeSpec(), KDateTime::Spec::LocalZone()); QVERIFY(!dateTime_LocalZone.isUtc()); QVERIFY(!dateTime_LocalZone.isOffsetFromUtc()); QVERIFY(dateTime_LocalZone.isLocalZone()); QVERIFY(!dateTime_LocalZone.isClockTime()); QCOMPARE(dateTime_LocalZone.utcOffset(), -8*3600); QCOMPARE(dateTime_LocalZone.timeZone(), KSystemTimeZones::local()); QCOMPARE(dateTime_LocalZone.dateTime(), QDateTime(d, t, Qt::LocalTime)); KDateTime datetime_LocalZone(dtLocal, KDateTime::LocalZone); QVERIFY(!datetime_LocalZone.isNull()); QVERIFY(datetime_LocalZone.isValid()); QVERIFY(!datetime_LocalZone.isDateOnly()); QCOMPARE(datetime_LocalZone.timeType(), KDateTime::TimeZone); QCOMPARE(datetime_LocalZone.timeSpec(), KDateTime::Spec::LocalZone()); QVERIFY(!datetime_LocalZone.isUtc()); QVERIFY(!datetime_LocalZone.isOffsetFromUtc()); QVERIFY(datetime_LocalZone.isLocalZone()); QVERIFY(!datetime_LocalZone.isClockTime()); QCOMPARE(datetime_LocalZone.utcOffset(), -8*3600); QCOMPARE(datetime_LocalZone.timeZone(), KSystemTimeZones::local()); QCOMPARE(datetime_LocalZone.dateTime(), dtLocal); QCOMPARE(datetime_LocalZone.date(), dtLocal.date()); QCOMPARE(datetime_LocalZone.time(), dtLocal.time()); KDateTime datetime_LocalZone2(dtUTC, KDateTime::LocalZone); QVERIFY(!datetime_LocalZone2.isNull()); QVERIFY(datetime_LocalZone2.isValid()); QVERIFY(!datetime_LocalZone2.isDateOnly()); QCOMPARE(datetime_LocalZone2.timeType(), KDateTime::TimeZone); QCOMPARE(datetime_LocalZone2.timeSpec(), KDateTime::Spec::LocalZone()); QVERIFY(!datetime_LocalZone2.isUtc()); QVERIFY(!datetime_LocalZone2.isOffsetFromUtc()); QVERIFY(datetime_LocalZone2.isLocalZone()); QVERIFY(!datetime_LocalZone2.isClockTime()); QCOMPARE(datetime_LocalZone2.utcOffset(), -8*3600); QCOMPARE(datetime_LocalZone2.timeZone(), KSystemTimeZones::local()); QCOMPARE(datetime_LocalZone2.dateTime(), dtUTC.toLocalTime()); // ... copy constructor KDateTime datetime_LocalZoneCopy(datetime_LocalZone); QVERIFY(!datetime_LocalZoneCopy.isNull()); QVERIFY(datetime_LocalZoneCopy.isValid()); QVERIFY(!datetime_LocalZoneCopy.isDateOnly()); QCOMPARE(datetime_LocalZoneCopy.timeType(), KDateTime::TimeZone); QCOMPARE(datetime_LocalZoneCopy.timeSpec(), KDateTime::Spec::LocalZone()); QVERIFY(!datetime_LocalZoneCopy.isUtc()); QVERIFY(!datetime_LocalZoneCopy.isOffsetFromUtc()); QVERIFY(datetime_LocalZoneCopy.isLocalZone()); QVERIFY(!datetime_LocalZoneCopy.isClockTime()); QCOMPARE(datetime_LocalZoneCopy.utcOffset(), -8*3600); QCOMPARE(datetime_LocalZoneCopy.timeZone(), datetime_LocalZone.timeZone()); QCOMPARE(datetime_LocalZoneCopy.dateTime(), datetime_LocalZone.dateTime()); // Local clock time KDateTime date_ClockTime(d, KDateTime::Spec::ClockTime()); QVERIFY(!date_ClockTime.isNull()); QVERIFY(date_ClockTime.isValid()); QVERIFY(date_ClockTime.isDateOnly()); QCOMPARE(date_ClockTime.timeType(), KDateTime::ClockTime); QVERIFY(!date_ClockTime.isUtc()); QVERIFY(!date_ClockTime.isOffsetFromUtc()); QVERIFY(!date_ClockTime.isLocalZone()); QVERIFY(date_ClockTime.isClockTime()); QCOMPARE(date_ClockTime.utcOffset(), 0); QVERIFY(!date_ClockTime.timeZone().isValid()); QCOMPARE(date_ClockTime.dateTime(), QDateTime(d, QTime(0,0,0), Qt::LocalTime)); KDateTime dateTime_ClockTime(d, t, KDateTime::ClockTime); QVERIFY(!dateTime_ClockTime.isNull()); QVERIFY(dateTime_ClockTime.isValid()); QVERIFY(!dateTime_ClockTime.isDateOnly()); QCOMPARE(dateTime_ClockTime.timeType(), KDateTime::ClockTime); QVERIFY(!dateTime_ClockTime.isUtc()); QVERIFY(!dateTime_ClockTime.isOffsetFromUtc()); QVERIFY(!dateTime_ClockTime.isLocalZone()); QVERIFY(dateTime_ClockTime.isClockTime()); QCOMPARE(dateTime_ClockTime.utcOffset(), 0); QVERIFY(!dateTime_ClockTime.timeZone().isValid()); QCOMPARE(dateTime_ClockTime.dateTime(), QDateTime(d, t, Qt::LocalTime)); KDateTime datetime_ClockTime(dtLocal, KDateTime::ClockTime); QVERIFY(!datetime_ClockTime.isNull()); QVERIFY(datetime_ClockTime.isValid()); QVERIFY(!datetime_ClockTime.isDateOnly()); QCOMPARE(datetime_ClockTime.timeType(), KDateTime::ClockTime); QVERIFY(!datetime_ClockTime.isUtc()); QVERIFY(!datetime_ClockTime.isOffsetFromUtc()); QVERIFY(!datetime_ClockTime.isLocalZone()); QVERIFY(datetime_ClockTime.isClockTime()); QCOMPARE(datetime_ClockTime.utcOffset(), 0); QVERIFY(!datetime_ClockTime.timeZone().isValid()); QCOMPARE(datetime_ClockTime.dateTime(), dtLocal); QCOMPARE(datetime_ClockTime.date(), dtLocal.date()); QCOMPARE(datetime_ClockTime.time(), dtLocal.time()); KDateTime datetime_ClockTime2(dtUTC, KDateTime::ClockTime); QVERIFY(!datetime_ClockTime2.isNull()); QVERIFY(datetime_ClockTime2.isValid()); QVERIFY(!datetime_ClockTime2.isDateOnly()); QCOMPARE(datetime_ClockTime2.timeType(), KDateTime::ClockTime); QVERIFY(!datetime_ClockTime2.isUtc()); QVERIFY(!datetime_ClockTime2.isOffsetFromUtc()); QVERIFY(!datetime_ClockTime2.isLocalZone()); QVERIFY(datetime_ClockTime2.isClockTime()); QCOMPARE(datetime_ClockTime2.utcOffset(), 0); QVERIFY(!datetime_ClockTime2.timeZone().isValid()); QCOMPARE(datetime_ClockTime2.dateTime(), dtUTC.toLocalTime()); // ... copy constructor KDateTime datetime_ClockTimeCopy(datetime_ClockTime); QVERIFY(!datetime_ClockTimeCopy.isNull()); QVERIFY(datetime_ClockTimeCopy.isValid()); QVERIFY(!datetime_ClockTimeCopy.isDateOnly()); QCOMPARE(datetime_ClockTimeCopy.timeType(), KDateTime::ClockTime); QVERIFY(!datetime_ClockTimeCopy.isUtc()); QVERIFY(!datetime_ClockTimeCopy.isOffsetFromUtc()); QVERIFY(!datetime_ClockTimeCopy.isLocalZone()); QVERIFY(datetime_ClockTimeCopy.isClockTime()); QCOMPARE(datetime_ClockTimeCopy.utcOffset(), 0); QVERIFY(!datetime_ClockTimeCopy.timeZone().isValid()); QCOMPARE(datetime_ClockTimeCopy.dateTime(), datetime_ClockTime.dateTime()); // Invalid time zone specification for a constructor KDateTime date_TimeZone(d, KDateTime::TimeZone); QVERIFY(!date_TimeZone.isValid()); KDateTime dateTime_TimeZone(d, t, KDateTime::TimeZone); QVERIFY(!dateTime_TimeZone.isValid()); KDateTime datetime_TimeZone(dtLocal, KDateTime::TimeZone); QVERIFY(!datetime_TimeZone.isValid()); KDateTime datetime_Invalid(dtLocal, KDateTime::Invalid); QVERIFY(!datetime_Invalid.isValid()); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } /////////////////////////////////// // Time conversion and operator==() /////////////////////////////////// void KDateTimeTest::toUtc() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Zone -> UTC KDateTime londonWinter(QDate(2005,1,1), QTime(0,0,0), london); KDateTime utcWinter = londonWinter.toUtc(); QVERIFY(utcWinter.isUtc()); QCOMPARE(utcWinter.dateTime(), QDateTime(QDate(2005,1,1), QTime(0,0,0), Qt::UTC)); QVERIFY(londonWinter == utcWinter); KDateTime londonSummer(QDate(2005,6,1), QTime(0,0,0), london); KDateTime utcSummer = londonSummer.toUtc(); QVERIFY(utcSummer.isUtc()); QCOMPARE(utcSummer.dateTime(), QDateTime(QDate(2005,5,31), QTime(23,0,0), Qt::UTC)); QVERIFY(londonSummer == utcSummer); QVERIFY(!(londonSummer == utcWinter)); QVERIFY(!(londonWinter == utcSummer)); // UTC offset -> UTC KDateTime offset(QDate(2005,6,6), QTime(1,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime utcOffset = offset.toUtc(); QVERIFY(utcOffset.isUtc()); QCOMPARE(utcOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(2,32,30), Qt::UTC)); QVERIFY(offset == utcOffset); QVERIFY(!(offset == utcSummer)); // Clock time -> UTC KDateTime clock(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime); KDateTime utcClock = clock.toUtc(); QVERIFY(utcClock.isUtc()); QCOMPARE(utcClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(8,2,30), Qt::UTC)); QVERIFY(clock == utcClock); QVERIFY(!(clock == utcOffset)); // UTC -> UTC KDateTime utc(QDate(2005,6,6), QTime(1,2,30), KDateTime::UTC); KDateTime utcUtc = utc.toUtc(); QVERIFY(utcUtc.isUtc()); QCOMPARE(utcUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(1,2,30), Qt::UTC)); QVERIFY(utc == utcUtc); QVERIFY(!(utc == utcClock)); // ** Date only ** // // Zone -> UTC londonSummer.setDateOnly(true); utcSummer = londonSummer.toUtc(); QVERIFY(utcSummer.isDateOnly()); QCOMPARE(utcSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(0,0,0), Qt::UTC)); QVERIFY(utcSummer != londonSummer); QVERIFY(!(utcSummer == londonSummer)); londonWinter.setDateOnly(true); utcWinter = londonWinter.toUtc(); QVERIFY(utcWinter == londonWinter); QVERIFY(!(utcWinter != londonWinter)); // UTC offset -> UTC offset.setDateOnly(true); utcOffset = offset.toUtc(); QVERIFY(utcOffset.isDateOnly()); QCOMPARE(utcOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::UTC)); QVERIFY(offset != utcOffset); QVERIFY(!(offset == utcOffset)); KDateTime utcOffset1(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(0)); QVERIFY(utcOffset1 == utcOffset1.toUtc()); // Clock time -> UTC clock.setDateOnly(true); utcClock = clock.toUtc(); QVERIFY(utcClock.isDateOnly()); QCOMPARE(utcClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::UTC)); QVERIFY(clock != utcClock); QVERIFY(!(clock == utcClock)); // UTC -> UTC utc.setDateOnly(true); utcUtc = utc.toUtc(); QVERIFY(utcUtc.isDateOnly()); QCOMPARE(utcUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::UTC)); QVERIFY(utc == utcUtc); QVERIFY(!(utc != utcUtc)); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::toOffsetFromUtc() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // ***** toOffsetFromUtc(void) ***** // Zone -> UTC offset KDateTime londonWinter(QDate(2005,1,1), QTime(2,0,0), london); KDateTime offsetWinter = londonWinter.toOffsetFromUtc(); QVERIFY(offsetWinter.isOffsetFromUtc()); QCOMPARE(offsetWinter.utcOffset(), 0); QCOMPARE(offsetWinter.dateTime(), QDateTime(QDate(2005,1,1), QTime(2,0,0), Qt::LocalTime)); QVERIFY(londonWinter == offsetWinter); KDateTime londonSummer(QDate(2005,6,1), QTime(14,0,0), london); KDateTime offsetSummer = londonSummer.toOffsetFromUtc(); QVERIFY(offsetSummer.isOffsetFromUtc()); QCOMPARE(offsetSummer.utcOffset(), 3600); QCOMPARE(offsetSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(14,0,0), Qt::LocalTime)); QVERIFY(londonSummer == offsetSummer); QVERIFY(!(londonSummer == offsetWinter)); QVERIFY(!(londonWinter == offsetSummer)); // UTC offset -> UTC offset KDateTime offset(QDate(2005,6,6), QTime(11,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime offsetOffset = offset.toOffsetFromUtc(); QVERIFY(offsetOffset.isOffsetFromUtc()); QCOMPARE(offsetOffset.utcOffset(), -5400); QCOMPARE(offsetOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(11,2,30), Qt::LocalTime)); QVERIFY(offset == offsetOffset); QVERIFY(!(offset == offsetSummer)); // Clock time -> UTC offset KDateTime clock(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime); KDateTime offsetClock = clock.toOffsetFromUtc(); QVERIFY(offsetClock.isOffsetFromUtc()); QCOMPARE(offsetClock.utcOffset(), -7*3600); QCOMPARE(offsetClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(1,2,30), Qt::LocalTime)); QVERIFY(clock == offsetClock); QVERIFY(!(clock == offsetOffset)); // UTC -> UTC offset KDateTime utc(QDate(2005,6,6), QTime(11,2,30), KDateTime::UTC); KDateTime offsetUtc = utc.toOffsetFromUtc(); QVERIFY(offsetUtc.isOffsetFromUtc()); QCOMPARE(offsetUtc.utcOffset(), 0); QCOMPARE(offsetUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(11,2,30), Qt::LocalTime)); QVERIFY(utc == offsetUtc); QVERIFY(!(utc == offsetClock)); // ** Date only ** // // Zone -> UTC offset londonSummer.setDateOnly(true); offsetSummer = londonSummer.toOffsetFromUtc(); QVERIFY(offsetSummer.isDateOnly()); QVERIFY(offsetSummer.isOffsetFromUtc()); QCOMPARE(offsetSummer.utcOffset(), 3600); QCOMPARE(offsetSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(0,0,0), Qt::LocalTime)); QVERIFY(offsetSummer == londonSummer); QVERIFY(!(offsetSummer != londonSummer)); londonWinter.setDateOnly(true); offsetWinter = londonWinter.toUtc(); QVERIFY(offsetWinter == londonWinter); QVERIFY(!(offsetWinter != londonWinter)); // UTC offset -> UTC offset offset.setDateOnly(true); offsetOffset = offset.toOffsetFromUtc(); QVERIFY(offsetOffset.isDateOnly()); QVERIFY(offsetOffset.isOffsetFromUtc()); QCOMPARE(offsetOffset.utcOffset(), -5400); QCOMPARE(offsetOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(offset == offsetOffset); QVERIFY(!(offset != offsetOffset)); // Clock time -> UTC offset clock.setDateOnly(true); offsetClock = clock.toOffsetFromUtc(); QVERIFY(offsetClock.isDateOnly()); QVERIFY(offsetClock.isOffsetFromUtc()); QCOMPARE(offsetClock.utcOffset(), -7*3600); QCOMPARE(offsetClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(clock == offsetClock); QVERIFY(!(clock != offsetClock)); // UTC -> UTC offset utc.setDateOnly(true); offsetUtc = utc.toOffsetFromUtc(); QVERIFY(offsetUtc.isDateOnly()); QVERIFY(offsetUtc.isOffsetFromUtc()); QCOMPARE(offsetUtc.utcOffset(), 0); QCOMPARE(offsetUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(utc == offsetUtc); QVERIFY(!(utc != offsetUtc)); // ***** toOffsetFromUtc(int utcOffset) ***** // Zone -> UTC offset KDateTime londonWinter2(QDate(2005,1,1), QTime(2,0,0), london); offsetWinter = londonWinter2.toOffsetFromUtc(5400); // +1H30M QVERIFY(offsetWinter.isOffsetFromUtc()); QCOMPARE(offsetWinter.utcOffset(), 5400); QCOMPARE(offsetWinter.dateTime(), QDateTime(QDate(2005,1,1), QTime(3,30,0), Qt::LocalTime)); QVERIFY(londonWinter2 == offsetWinter); KDateTime londonSummer2(QDate(2005,6,1), QTime(14,0,0), london); offsetSummer = londonSummer2.toOffsetFromUtc(5400); QVERIFY(offsetSummer.isOffsetFromUtc()); QCOMPARE(offsetSummer.utcOffset(), 5400); QCOMPARE(offsetSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(14,30,0), Qt::LocalTime)); QVERIFY(londonSummer2 == offsetSummer); QVERIFY(!(londonSummer2 == offsetWinter)); QVERIFY(!(londonWinter2 == offsetSummer)); // UTC offset -> UTC offset KDateTime offset2(QDate(2005,6,6), QTime(11,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 offsetOffset = offset2.toOffsetFromUtc(3600); QVERIFY(offsetOffset.isOffsetFromUtc()); QCOMPARE(offsetOffset.utcOffset(), 3600); QCOMPARE(offsetOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(13,32,30), Qt::LocalTime)); QVERIFY(offset2 == offsetOffset); QVERIFY(!(offset2 == offsetSummer)); // Clock time -> UTC offset KDateTime clock2(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime); offsetClock = clock2.toOffsetFromUtc(0); QVERIFY(offsetClock.isOffsetFromUtc()); QCOMPARE(offsetClock.utcOffset(), 0); QCOMPARE(offsetClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(8,2,30), Qt::LocalTime)); QVERIFY(clock2 == offsetClock); QVERIFY(!(clock2 == offsetOffset)); // UTC -> UTC offset KDateTime utc2(QDate(2005,6,6), QTime(11,2,30), KDateTime::UTC); offsetUtc = utc2.toOffsetFromUtc(-3600); QVERIFY(offsetUtc.isOffsetFromUtc()); QCOMPARE(offsetUtc.utcOffset(), -3600); QCOMPARE(offsetUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(10,2,30), Qt::LocalTime)); QVERIFY(utc2 == offsetUtc); QVERIFY(!(utc2 == offsetClock)); // ** Date only ** // // Zone -> UTC offset londonSummer2.setDateOnly(true); offsetSummer = londonSummer2.toOffsetFromUtc(5400); QVERIFY(offsetSummer.isDateOnly()); QVERIFY(offsetSummer.isOffsetFromUtc()); QCOMPARE(offsetSummer.utcOffset(), 5400); QCOMPARE(offsetSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(0,0,0), Qt::LocalTime)); QVERIFY(londonSummer2 != offsetSummer); QVERIFY(!(londonSummer2 == offsetSummer)); QVERIFY(londonSummer2 == KDateTime(QDate(2005,6,1), KDateTime::Spec::OffsetFromUTC(3600))); // UTC offset -> UTC offset offset2.setDateOnly(true); offsetOffset = offset2.toOffsetFromUtc(-3600); QVERIFY(offsetOffset.isDateOnly()); QVERIFY(offsetOffset.isOffsetFromUtc()); QCOMPARE(offsetOffset.utcOffset(), -3600); QCOMPARE(offsetOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(offset2 != offsetOffset); QVERIFY(!(offset2 == offsetOffset)); // Clock time -> UTC offset clock2.setDateOnly(true); offsetClock = clock2.toOffsetFromUtc(6*3600); QVERIFY(offsetClock.isDateOnly()); QVERIFY(offsetClock.isOffsetFromUtc()); QCOMPARE(offsetClock.utcOffset(), 6*3600); QCOMPARE(offsetClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(clock2 != offsetClock); QVERIFY(!(clock2 == offsetClock)); QVERIFY(clock == KDateTime(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(-7*3600))); // UTC -> UTC offset utc2.setDateOnly(true); offsetUtc = utc2.toOffsetFromUtc(1800); QVERIFY(offsetUtc.isDateOnly()); QVERIFY(offsetUtc.isOffsetFromUtc()); QCOMPARE(offsetUtc.utcOffset(), 1800); QCOMPARE(offsetUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(utc2 != offsetUtc); QVERIFY(!(utc2 == offsetUtc)); QVERIFY(utc2 == KDateTime(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(0))); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::toLocalZone() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Zone -> LocalZone KDateTime londonWinter(QDate(2005,1,1), QTime(0,0,0), london); KDateTime locWinter = londonWinter.toLocalZone(); QVERIFY(locWinter.isLocalZone()); QCOMPARE(locWinter.dateTime(), QDateTime(QDate(2004,12,31), QTime(16,0,0), Qt::LocalTime)); QVERIFY(londonWinter == locWinter); KDateTime londonSummer(QDate(2005,6,1), QTime(0,0,0), london); KDateTime locSummer = londonSummer.toLocalZone(); QVERIFY(locSummer.isLocalZone()); QCOMPARE(locSummer.dateTime(), QDateTime(QDate(2005,5,31), QTime(16,0,0), Qt::LocalTime)); QVERIFY(londonSummer == locSummer); QVERIFY(!(londonSummer == locWinter)); QVERIFY(!(londonWinter == locSummer)); // UTC offset -> LocalZone KDateTime offset(QDate(2005,6,6), QTime(11,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime locOffset = offset.toLocalZone(); QVERIFY(locOffset.isLocalZone()); QCOMPARE(locOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(5,32,30), Qt::LocalTime)); QVERIFY(offset == locOffset); QVERIFY(!(offset == locSummer)); // Clock time -> LocalZone KDateTime clock(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime); KDateTime locClock = clock.toLocalZone(); QVERIFY(locClock.isLocalZone()); QCOMPARE(locClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(1,2,30), Qt::LocalTime)); QVERIFY(clock == locClock); QVERIFY(!(clock == locOffset)); // UTC -> LocalZone KDateTime utc(QDate(2005,6,6), QTime(11,2,30), KDateTime::UTC); KDateTime locUtc = utc.toLocalZone(); QVERIFY(locUtc.isLocalZone()); QCOMPARE(locUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(4,2,30), Qt::LocalTime)); QVERIFY(utc == locUtc); QVERIFY(!(utc == locClock)); // ** Date only ** // // Zone -> LocalZone londonSummer.setDateOnly(true); locSummer = londonSummer.toLocalZone(); QVERIFY(locSummer.isDateOnly()); QCOMPARE(locSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(0,0,0), Qt::LocalTime)); QVERIFY(londonSummer != locSummer); QVERIFY(!(londonSummer == locSummer)); // UTC offset -> LocalZone offset.setDateOnly(true); locOffset = offset.toLocalZone(); QVERIFY(locOffset.isDateOnly()); QCOMPARE(locOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(offset != locOffset); QVERIFY(!(offset == locOffset)); QVERIFY(locOffset == KDateTime(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(-7*3600))); // Clock time -> LocalZone clock.setDateOnly(true); locClock = clock.toLocalZone(); QVERIFY(locClock.isDateOnly()); QCOMPARE(locClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(clock == locClock); QVERIFY(!(clock != locClock)); // UTC -> LocalZone utc.setDateOnly(true); locUtc = utc.toLocalZone(); QVERIFY(locUtc.isDateOnly()); QCOMPARE(locUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(utc != locUtc); QVERIFY(!(utc == locUtc)); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::toClockTime() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Zone -> ClockTime KDateTime londonWinter(QDate(2005,1,1), QTime(0,0,0), london); KDateTime locWinter = londonWinter.toClockTime(); QVERIFY(locWinter.isClockTime()); QCOMPARE(locWinter.dateTime(), QDateTime(QDate(2004,12,31), QTime(16,0,0), Qt::LocalTime)); QVERIFY(londonWinter == locWinter); KDateTime londonSummer(QDate(2005,6,1), QTime(0,0,0), london); KDateTime locSummer = londonSummer.toClockTime(); QVERIFY(locSummer.isClockTime()); QCOMPARE(locSummer.dateTime(), QDateTime(QDate(2005,5,31), QTime(16,0,0), Qt::LocalTime)); QVERIFY(londonSummer == locSummer); QVERIFY(!(londonSummer == locWinter)); QVERIFY(!(londonWinter == locSummer)); // UTC offset -> ClockTime KDateTime offset(QDate(2005,6,6), QTime(11,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime locOffset = offset.toClockTime(); QVERIFY(locOffset.isClockTime()); QCOMPARE(locOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(5,32,30), Qt::LocalTime)); QVERIFY(offset == locOffset); QVERIFY(!(offset == locSummer)); // Clock time -> ClockTime KDateTime clock(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime); KDateTime locClock = clock.toClockTime(); QVERIFY(locClock.isClockTime()); QCOMPARE(locClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(1,2,30), Qt::LocalTime)); QVERIFY(clock == locClock); QVERIFY(!(clock == locOffset)); // UTC -> ClockTime KDateTime utc(QDate(2005,6,6), QTime(11,2,30), KDateTime::UTC); KDateTime locUtc = utc.toClockTime(); QVERIFY(locUtc.isClockTime()); QCOMPARE(locUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(4,2,30), Qt::LocalTime)); QVERIFY(utc == locUtc); QVERIFY(!(utc == locClock)); // ** Date only ** // // Zone -> ClockTime londonSummer.setDateOnly(true); locSummer = londonSummer.toClockTime(); QVERIFY(locSummer.isDateOnly()); QCOMPARE(locSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(0,0,0), Qt::LocalTime)); QVERIFY(londonSummer != locSummer); QVERIFY(!(londonSummer == locSummer)); // UTC offset -> ClockTime offset.setDateOnly(true); locOffset = offset.toClockTime(); QVERIFY(locOffset.isDateOnly()); QCOMPARE(locOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(offset != locOffset); QVERIFY(!(offset == locOffset)); QVERIFY(locOffset == KDateTime(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(-7*3600))); // Clock time -> ClockTime clock.setDateOnly(true); locClock = clock.toClockTime(); QVERIFY(locClock.isDateOnly()); QCOMPARE(locClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(clock == locClock); QVERIFY(!(clock != locClock)); // UTC -> ClockTime utc.setDateOnly(true); locUtc = utc.toClockTime(); QVERIFY(locUtc.isDateOnly()); QCOMPARE(locUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(utc != locUtc); QVERIFY(!(utc == locUtc)); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::toZone() { const QString localtzname = KSystemTimeZones::local().name(); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":Europe/London", 1); ::tzset(); KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone losAngeles = KSystemTimeZones::zone("America/Los_Angeles"); // Zone -> Zone KDateTime londonWinter(QDate(2005,1,1), QTime(0,0,0), london); KDateTime locWinter = londonWinter.toZone(losAngeles); QCOMPARE(locWinter.timeZone(), losAngeles); QCOMPARE(locWinter.dateTime(), QDateTime(QDate(2004,12,31), QTime(16,0,0), Qt::LocalTime)); QVERIFY(londonWinter == locWinter); KDateTime londonSummer(QDate(2005,6,1), QTime(0,0,0), london); KDateTime locSummer = londonSummer.toZone(losAngeles); QCOMPARE(locWinter.timeZone(), losAngeles); QCOMPARE(locSummer.dateTime(), QDateTime(QDate(2005,5,31), QTime(16,0,0), Qt::LocalTime)); QVERIFY(londonSummer == locSummer); QVERIFY(!(londonSummer == locWinter)); QVERIFY(!(londonWinter == locSummer)); // UTC offset -> Zone KDateTime offset(QDate(2005,6,6), QTime(11,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime locOffset = offset.toZone(losAngeles); QCOMPARE(locOffset.timeZone(), losAngeles); QCOMPARE(locOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(5,32,30), Qt::LocalTime)); QVERIFY(offset == locOffset); QVERIFY(!(offset == locSummer)); // Clock time -> Zone KDateTime clock(QDate(2005,6,6), QTime(11,2,30), KDateTime::ClockTime); KDateTime locClock = clock.toZone(losAngeles); QCOMPARE(locClock.timeZone(), losAngeles); QCOMPARE(locClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(3,2,30), Qt::LocalTime)); QVERIFY(clock == locClock); QVERIFY(!(clock == locOffset)); // UTC -> Zone KDateTime utc(QDate(2005,6,6), QTime(11,2,30), KDateTime::UTC); KDateTime locUtc = utc.toZone(losAngeles); QCOMPARE(locUtc.timeZone(), losAngeles); QCOMPARE(locUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(4,2,30), Qt::LocalTime)); QVERIFY(utc == locUtc); QVERIFY(!(utc == locClock)); // ** Date only ** // // Zone -> Zone londonSummer.setDateOnly(true); locSummer = londonSummer.toZone(losAngeles); QVERIFY(locSummer.isDateOnly()); QCOMPARE(locSummer.dateTime(), QDateTime(QDate(2005,6,1), QTime(0,0,0), Qt::LocalTime)); QVERIFY(londonSummer != locSummer); QVERIFY(!(londonSummer == locSummer)); // UTC offset -> Zone offset.setDateOnly(true); locOffset = offset.toZone(losAngeles); QVERIFY(locOffset.isDateOnly()); QCOMPARE(locOffset.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(offset != locOffset); QVERIFY(!(offset == locOffset)); // Clock time -> Zone clock.setDateOnly(true); locClock = clock.toZone(losAngeles); QVERIFY(locClock.isDateOnly()); QCOMPARE(locClock.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(clock != locClock); QVERIFY(!(clock == locClock)); // UTC -> Zone utc.setDateOnly(true); locUtc = utc.toZone(losAngeles); QVERIFY(locUtc.isDateOnly()); QCOMPARE(locUtc.dateTime(), QDateTime(QDate(2005,6,6), QTime(0,0,0), Qt::LocalTime)); QVERIFY(utc != locUtc); QVERIFY(!(utc == locUtc)); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::toTimeSpec() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone cairo = KSystemTimeZones::zone("Africa/Cairo"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); KDateTime::Spec utcSpec(KDateTime::UTC); KDateTime::Spec cairoSpec(cairo); KDateTime::Spec offset1200Spec(KDateTime::OffsetFromUTC, 1200); KDateTime::Spec clockSpec(KDateTime::ClockTime); KDateTime utc1(QDate(2004,3,1), QTime(3,45,2), KDateTime::UTC); KDateTime zone1(QDate(2004,3,1), QTime(3,45,2), cairo); KDateTime offset1(QDate(2004,3,1), QTime(3,45,2), KDateTime::Spec::OffsetFromUTC(1200)); // +00:20 KDateTime clock1(QDate(2004,3,1), QTime(3,45,2), KDateTime::ClockTime); KDateTime utc(QDate(2005,6,6), QTime(1,2,30), KDateTime::UTC); KDateTime zone(QDate(2005,7,1), QTime(2,0,0), london); KDateTime offset(QDate(2005,6,6), QTime(1,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -01:30 KDateTime clock(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime); // To UTC KDateTime utcZone = zone.toTimeSpec(utcSpec); QVERIFY(utcZone.isUtc()); QVERIFY(utcZone == KDateTime(QDate(2005,7,1), QTime(1,0,0), KDateTime::UTC)); QVERIFY(zone.timeSpec() != utcSpec); QVERIFY(utcZone.timeSpec() == utcSpec); KDateTime utcOffset = offset.toTimeSpec(utcSpec); QVERIFY(utcOffset.isUtc()); QVERIFY(utcOffset == KDateTime(QDate(2005,6,6), QTime(2,32,30), KDateTime::UTC)); QVERIFY(offset.timeSpec() != utcSpec); QVERIFY(utcOffset.timeSpec() == utcSpec); KDateTime utcClock = clock.toTimeSpec(utcSpec); QVERIFY(utcClock.isUtc()); QVERIFY(utcClock == KDateTime(QDate(2005,6,6), QTime(8,2,30), KDateTime::UTC)); QVERIFY(clock.timeSpec() != utcSpec); QVERIFY(utcZone.timeSpec() == utcSpec); KDateTime utcUtc = utc.toTimeSpec(utcSpec); QVERIFY(utcUtc.isUtc()); QVERIFY(utcUtc == KDateTime(QDate(2005,6,6), QTime(1,2,30), KDateTime::UTC)); QVERIFY(utc.timeSpec() == utcSpec); QVERIFY(utcUtc.timeSpec() == utcSpec); // To Zone KDateTime zoneZone = zone.toTimeSpec(cairoSpec); QCOMPARE(zoneZone.timeZone(), cairo); QVERIFY(zoneZone == KDateTime(QDate(2005,7,1), QTime(4,0,0), cairo)); QVERIFY(zone.timeSpec() != cairoSpec); QVERIFY(zoneZone.timeSpec() == cairoSpec); KDateTime zoneOffset = offset.toTimeSpec(cairoSpec); QCOMPARE(zoneOffset.timeZone(), cairo); QVERIFY(zoneOffset == KDateTime(QDate(2005,6,6), QTime(5,32,30), cairo)); QVERIFY(offset.timeSpec() != cairoSpec); QVERIFY(zoneOffset.timeSpec() == cairoSpec); KDateTime zoneClock = clock.toTimeSpec(cairoSpec); QCOMPARE(zoneClock.timeZone(), cairo); QVERIFY(zoneClock == KDateTime(QDate(2005,6,6), QTime(11,2,30), cairo)); QVERIFY(clock.timeSpec() != cairoSpec); QVERIFY(zoneClock.timeSpec() == cairoSpec); KDateTime zoneUtc = utc.toTimeSpec(cairoSpec); QCOMPARE(zoneUtc.timeZone(), cairo); QVERIFY(zoneUtc == KDateTime(QDate(2005,6,6), QTime(4,2,30), cairo)); QVERIFY(utc.timeSpec() != cairoSpec); QVERIFY(zoneUtc.timeSpec() == cairoSpec); // To UTC offset KDateTime offsetZone = zone.toTimeSpec(offset1200Spec); QVERIFY(offsetZone.isOffsetFromUtc()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetZone == KDateTime(QDate(2005,7,1), QTime(1,20,0), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(zone.timeSpec() != offset1200Spec); QVERIFY(offsetZone.timeSpec() == offset1200Spec); KDateTime offsetOffset = offset.toTimeSpec(offset1200Spec); QVERIFY(offsetOffset.isOffsetFromUtc()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetOffset == KDateTime(QDate(2005,6,6), QTime(2,52,30), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(offset.timeSpec() != offset1200Spec); QVERIFY(offsetOffset.timeSpec() == offset1200Spec); KDateTime offsetClock = clock.toTimeSpec(offset1200Spec); QVERIFY(offsetClock.isOffsetFromUtc()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetClock == KDateTime(QDate(2005,6,6), QTime(8,22,30), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(clock.timeSpec() != offset1200Spec); QVERIFY(offsetClock.timeSpec() == offset1200Spec); KDateTime offsetUtc = utc.toTimeSpec(offset1200Spec); QVERIFY(offsetUtc.isOffsetFromUtc()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetUtc == KDateTime(QDate(2005,6,6), QTime(1,22,30), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(utc.timeSpec() != offset1200Spec); QVERIFY(offsetUtc.timeSpec() == offset1200Spec); // To Clock time KDateTime clockZone = zone.toTimeSpec(clockSpec); QVERIFY(clockZone.isClockTime()); QVERIFY(clockZone == KDateTime(QDate(2005,6,30), QTime(18,0,0), KDateTime::ClockTime)); QVERIFY(zone.timeSpec() != clockSpec); QVERIFY(clockZone.timeSpec() == clockSpec); KDateTime clockOffset = offset.toTimeSpec(clockSpec); QVERIFY(clockOffset.isClockTime()); QVERIFY(clockOffset == KDateTime(QDate(2005,6,5), QTime(19,32,30), KDateTime::ClockTime)); QVERIFY(offset.timeSpec() != clockSpec); QVERIFY(clockOffset.timeSpec() == clockSpec); KDateTime clockClock = clock.toTimeSpec(clockSpec); QVERIFY(clockClock.isClockTime()); QVERIFY(clockClock == KDateTime(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime)); QVERIFY(clock.timeSpec() == clockSpec); QVERIFY(clockClock.timeSpec() == clockSpec); KDateTime clockUtc = utc.toTimeSpec(clockSpec); QVERIFY(clockUtc.isClockTime()); QVERIFY(clockUtc == KDateTime(QDate(2005,6,5), QTime(18,2,30), KDateTime::ClockTime)); QVERIFY(utc.timeSpec() != clockSpec); QVERIFY(clockUtc.timeSpec() == clockSpec); // ** Date only ** // KDateTime zoned(QDate(2005,7,1), london); KDateTime offsetd(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(-5400)); // -01:30 KDateTime clockd(QDate(2005,6,6), KDateTime::ClockTime); KDateTime utcd(QDate(2005,6,6), KDateTime::UTC); // To UTC utcZone = zoned.toTimeSpec(utcSpec); QVERIFY(utcZone.isUtc()); QVERIFY(utcZone.isDateOnly()); QVERIFY(utcZone == KDateTime(QDate(2005,7,1), KDateTime::UTC)); QVERIFY(utcZone != zoned); utcOffset = offsetd.toTimeSpec(utcSpec); QVERIFY(utcOffset.isUtc()); QVERIFY(utcOffset.isDateOnly()); QVERIFY(utcOffset == KDateTime(QDate(2005,6,6), KDateTime::UTC)); QVERIFY(utcOffset != offsetd); utcClock = clockd.toTimeSpec(utcSpec); QVERIFY(utcClock.isUtc()); QVERIFY(utcClock.isDateOnly()); QVERIFY(utcClock == KDateTime(QDate(2005,6,6), KDateTime::UTC)); QVERIFY(utcClock != clockd); utcUtc = utcd.toTimeSpec(utcSpec); QVERIFY(utcUtc.isUtc()); QVERIFY(utcUtc.isDateOnly()); QVERIFY(utcUtc == KDateTime(QDate(2005,6,6), KDateTime::UTC)); QVERIFY(utcUtc == utcd); // To Zone zoneZone = zoned.toTimeSpec(cairoSpec); QVERIFY(zoneZone.isDateOnly()); QCOMPARE(zoneZone.timeZone(), cairo); QVERIFY(zoneZone == KDateTime(QDate(2005,7,1), cairo)); QVERIFY(zoneZone != zoned); zoneOffset = offsetd.toTimeSpec(cairoSpec); QVERIFY(zoneOffset.isDateOnly()); QCOMPARE(zoneOffset.timeZone(), cairo); QVERIFY(zoneOffset == KDateTime(QDate(2005,6,6), cairo)); QVERIFY(zoneOffset != offsetd); zoneClock = clockd.toTimeSpec(cairoSpec); QVERIFY(zoneClock.isDateOnly()); QCOMPARE(zoneClock.timeZone(), cairo); QVERIFY(zoneClock == KDateTime(QDate(2005,6,6), cairo)); QVERIFY(zoneClock != clockd); zoneUtc = utcd.toTimeSpec(cairoSpec); QVERIFY(zoneUtc.isDateOnly()); QCOMPARE(zoneUtc.timeZone(), cairo); QVERIFY(zoneUtc == KDateTime(QDate(2005,6,6), cairo)); QVERIFY(zoneUtc != utcd); // To UTC offset offsetZone = zoned.toTimeSpec(offset1200Spec); QVERIFY(offsetZone.isOffsetFromUtc()); QVERIFY(offsetZone.isDateOnly()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetZone == KDateTime(QDate(2005,7,1), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(offsetZone != zoned); offsetOffset = offsetd.toTimeSpec(offset1200Spec); QVERIFY(offsetOffset.isOffsetFromUtc()); QVERIFY(offsetOffset.isDateOnly()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetOffset == KDateTime(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(offsetOffset != offsetd); offsetClock = clockd.toTimeSpec(offset1200Spec); QVERIFY(offsetClock.isOffsetFromUtc()); QVERIFY(offsetClock.isDateOnly()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetClock == KDateTime(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(offsetClock != clockd); offsetUtc = utcd.toTimeSpec(offset1200Spec); QVERIFY(offsetUtc.isOffsetFromUtc()); QVERIFY(offsetUtc.isDateOnly()); QCOMPARE(offsetZone.utcOffset(), 1200); QVERIFY(offsetUtc == KDateTime(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(1200))); QVERIFY(offsetUtc != utcd); // To Clock time clockZone = zoned.toTimeSpec(clockSpec); QVERIFY(clockZone.isClockTime()); QVERIFY(clockZone.isDateOnly()); QVERIFY(clockZone == KDateTime(QDate(2005,7,1), KDateTime::ClockTime)); QVERIFY(clockZone != zoned); clockOffset = offsetd.toTimeSpec(clockSpec); QVERIFY(clockOffset.isClockTime()); QVERIFY(clockOffset.isDateOnly()); QVERIFY(clockOffset == KDateTime(QDate(2005,6,6), KDateTime::ClockTime)); QVERIFY(clockOffset != offsetd); clockClock = clockd.toTimeSpec(clockSpec); QVERIFY(clockClock.isClockTime()); QVERIFY(clockClock.isDateOnly()); QVERIFY(clockClock == KDateTime(QDate(2005,6,6), KDateTime::ClockTime)); QVERIFY(clockClock == clockd); clockUtc = utcd.toTimeSpec(clockSpec); QVERIFY(clockUtc.isClockTime()); QVERIFY(clockUtc.isDateOnly()); QVERIFY(clockUtc == KDateTime(QDate(2005,6,6), KDateTime::ClockTime)); QVERIFY(clockUtc != utcd); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } //////////////////////////////////////////////////////////////////////// // Set methods: setDate(), setTime(), setDateTime(), setTimeSpec() //////////////////////////////////////////////////////////////////////// void KDateTimeTest::set() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Zone KDateTime zoned(QDate(2005,6,1), london); zoned.setDate(QDate(2004,5,2)); QVERIFY(zoned.isDateOnly()); QCOMPARE(zoned.dateTime(), QDateTime(QDate(2004,5,2), QTime(0,0,0), Qt::LocalTime)); zoned.setTime(QTime(12,13,14)); QVERIFY(!zoned.isDateOnly()); QCOMPARE(zoned.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::LocalTime)); zoned.setDate(QDate(2004,5,4)); QVERIFY(!zoned.isDateOnly()); zoned.setDateOnly(false); QVERIFY(!zoned.isDateOnly()); QCOMPARE(zoned.dateTime(), QDateTime(QDate(2004,5,4), QTime(12,13,14), Qt::LocalTime)); zoned.setDateOnly(true); QVERIFY(zoned.isDateOnly()); QCOMPARE(zoned.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::LocalTime)); zoned.setDateOnly(false); QVERIFY(!zoned.isDateOnly()); QCOMPARE(zoned.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::LocalTime)); KDateTime zone(QDate(2005,6,1), QTime(3,40,0), london); zone.setDate(QDate(2004,5,2)); QCOMPARE(zone.dateTime(), QDateTime(QDate(2004,5,2), QTime(3,40,0), Qt::LocalTime)); zone.setTime(QTime(12,13,14)); QCOMPARE(zone.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::LocalTime)); zone.setDateTime(QDateTime(QDate(2003,6,10), QTime(5,6,7))); QCOMPARE(zone.dateTime(), QDateTime(QDate(2003,6,10), QTime(5,6,7), Qt::LocalTime)); QCOMPARE(zone.utcOffset(), 3600); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(4,6,7), Qt::UTC)); // UTC offset KDateTime offsetd(QDate(2005,6,6), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 offsetd.setDate(QDate(2004,5,2)); QVERIFY(offsetd.isDateOnly()); QCOMPARE(offsetd.dateTime(), QDateTime(QDate(2004,5,2), QTime(0,0,0), Qt::LocalTime)); offsetd.setTime(QTime(12,13,14)); QVERIFY(!offsetd.isDateOnly()); QCOMPARE(offsetd.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::LocalTime)); offsetd.setDate(QDate(2004,5,4)); QVERIFY(!offsetd.isDateOnly()); offsetd.setDateOnly(false); QVERIFY(!offsetd.isDateOnly()); QCOMPARE(offsetd.dateTime(), QDateTime(QDate(2004,5,4), QTime(12,13,14), Qt::LocalTime)); offsetd.setDateOnly(true); QVERIFY(offsetd.isDateOnly()); QCOMPARE(offsetd.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::LocalTime)); offsetd.setDateOnly(false); QVERIFY(!offsetd.isDateOnly()); QCOMPARE(offsetd.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::LocalTime)); KDateTime offset(QDate(2005,6,6), QTime(1,2,30), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 offset.setDate(QDate(2004,5,2)); QCOMPARE(offset.dateTime(), QDateTime(QDate(2004,5,2), QTime(1,2,30), Qt::LocalTime)); offset.setTime(QTime(12,13,14)); QCOMPARE(offset.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::LocalTime)); offset.setDateTime(QDateTime(QDate(2003,12,10), QTime(5,6,7))); QCOMPARE(offset.dateTime(), QDateTime(QDate(2003,12,10), QTime(5,6,7), Qt::LocalTime)); QCOMPARE(offset.utcOffset(), -5400); QCOMPARE(offset.toUtc().dateTime(), QDateTime(QDate(2003,12,10), QTime(6,36,7), Qt::UTC)); // Clock time KDateTime clockd(QDate(2005,6,6), KDateTime::ClockTime); clockd.setDate(QDate(2004,5,2)); QVERIFY(clockd.isDateOnly()); QCOMPARE(clockd.dateTime(), QDateTime(QDate(2004,5,2), QTime(0,0,0), Qt::LocalTime)); clockd.setTime(QTime(12,13,14)); QVERIFY(!clockd.isDateOnly()); QCOMPARE(clockd.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::LocalTime)); clockd.setDate(QDate(2004,5,4)); QVERIFY(!clockd.isDateOnly()); clockd.setDateOnly(false); QVERIFY(!clockd.isDateOnly()); QCOMPARE(clockd.dateTime(), QDateTime(QDate(2004,5,4), QTime(12,13,14), Qt::LocalTime)); clockd.setDateOnly(true); QVERIFY(clockd.isDateOnly()); QCOMPARE(clockd.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::LocalTime)); clockd.setDateOnly(false); QVERIFY(!clockd.isDateOnly()); QCOMPARE(clockd.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::LocalTime)); KDateTime clock(QDate(2005,6,6), QTime(1,2,30), KDateTime::ClockTime); clock.setDate(QDate(2004,5,2)); QCOMPARE(clock.dateTime(), QDateTime(QDate(2004,5,2), QTime(1,2,30), Qt::LocalTime)); clock.setTime(QTime(12,13,14)); QCOMPARE(clock.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::LocalTime)); clock.setDateTime(QDateTime(QDate(2003,12,10), QTime(5,6,7))); QCOMPARE(clock.dateTime(), QDateTime(QDate(2003,12,10), QTime(5,6,7), Qt::LocalTime)); QCOMPARE(clock.utcOffset(), 0); QCOMPARE(clock.toUtc().dateTime(), QDateTime(QDate(2003,12,10), QTime(13,6,7), Qt::UTC)); // UTC KDateTime utcd(QDate(2005,6,6), KDateTime::UTC); utcd.setDate(QDate(2004,5,2)); QVERIFY(utcd.isDateOnly()); QCOMPARE(utcd.dateTime(), QDateTime(QDate(2004,5,2), QTime(0,0,0), Qt::UTC)); utcd.setTime(QTime(12,13,14)); QVERIFY(!utcd.isDateOnly()); QCOMPARE(utcd.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::UTC)); utcd.setDate(QDate(2004,5,4)); QVERIFY(!utcd.isDateOnly()); utcd.setDateOnly(false); QVERIFY(!utcd.isDateOnly()); QCOMPARE(utcd.dateTime(), QDateTime(QDate(2004,5,4), QTime(12,13,14), Qt::UTC)); utcd.setDateOnly(true); QVERIFY(utcd.isDateOnly()); QCOMPARE(utcd.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::UTC)); utcd.setDateOnly(false); QVERIFY(!utcd.isDateOnly()); QCOMPARE(utcd.dateTime(), QDateTime(QDate(2004,5,4), QTime(0,0,0), Qt::UTC)); KDateTime utc(QDate(2005,6,6), QTime(1,2,30), KDateTime::UTC); utc.setDate(QDate(2004,5,2)); QCOMPARE(utc.dateTime(), QDateTime(QDate(2004,5,2), QTime(1,2,30), Qt::UTC)); utc.setTime(QTime(12,13,14)); QCOMPARE(utc.dateTime(), QDateTime(QDate(2004,5,2), QTime(12,13,14), Qt::UTC)); utc.setDateTime(QDateTime(QDate(2003,12,10), QTime(5,6,7), Qt::UTC)); QCOMPARE(utc.utcOffset(), 0); QCOMPARE(utc.dateTime(), QDateTime(QDate(2003,12,10), QTime(5,6,7), Qt::UTC)); // setTimeSpec(SpecType) QCOMPARE(zone.dateTime(), QDateTime(QDate(2003,6,10), QTime(5,6,7), Qt::LocalTime)); zone.setTimeSpec(KDateTime::Spec::OffsetFromUTC(7200)); QVERIFY(zone.isOffsetFromUtc()); QCOMPARE(zone.utcOffset(), 7200); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(3,6,7), Qt::UTC)); zone.setTimeSpec(KDateTime::LocalZone); QVERIFY(zone.isLocalZone()); QCOMPARE(zone.utcOffset(), -7*3600); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(12,6,7), Qt::UTC)); zone.setTimeSpec(KDateTime::UTC); QVERIFY(zone.isUtc()); QCOMPARE(zone.utcOffset(), 0); QCOMPARE(zone.dateTime(), QDateTime(QDate(2003,6,10), QTime(5,6,7), Qt::UTC)); zone.setTimeSpec(KDateTime::ClockTime); QVERIFY(zone.isClockTime()); QCOMPARE(zone.utcOffset(), 0); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(12,6,7), Qt::UTC)); // setTimeSpec(KDateTime::Spec) QCOMPARE(zone.dateTime(), QDateTime(QDate(2003,6,10), QTime(5,6,7), Qt::LocalTime)); zone.setTimeSpec(offset.timeSpec()); QVERIFY(zone.isOffsetFromUtc()); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(6,36,7), Qt::UTC)); QVERIFY(zone.timeSpec() == offset.timeSpec()); zone.setTimeSpec(KDateTime::LocalZone); QVERIFY(zone.isLocalZone()); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(12,6,7), Qt::UTC)); zone.setTimeSpec(utc.timeSpec()); QVERIFY(zone.isUtc()); QCOMPARE(zone.dateTime(), QDateTime(QDate(2003,6,10), QTime(5,6,7), Qt::UTC)); zone.setTimeSpec(clock.timeSpec()); QVERIFY(zone.isClockTime()); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(12,6,7), Qt::UTC)); zone.setTimeSpec(london); QCOMPARE(zone.timeZone(), london); QCOMPARE(zone.utcOffset(), 3600); QCOMPARE(zone.toUtc().dateTime(), QDateTime(QDate(2003,6,10), QTime(4,6,7), Qt::UTC)); // time_t utcd = KDateTime(QDate(2005,6,6), QTime(12,15,20), KDateTime::UTC); QDateTime qtt = utcd.dateTime(); uint secs = qtt.toTime_t(); KDateTime tt; tt.setTime_t(static_cast(secs)); QVERIFY(tt.isUtc()); QCOMPARE(tt.dateTime(), utcd.dateTime()); QCOMPARE(tt.toTime_t(), secs); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } ///////////////////////////////////////////////////////// // operator==() ///////////////////////////////////////////////////////// void KDateTimeTest::equal() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone cairo = KSystemTimeZones::zone("Africa/Cairo"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Date/time values QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,2,28), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,2,29), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,1), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,2), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,3), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,3), cairo) == KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo))); QVERIFY(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo)); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,2,28), QTime(3,45,3), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,2,29), QTime(3,45,3), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,1), QTime(3,45,3), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,2), QTime(3,45,3), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,3), QTime(3,45,3), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,1), QTime(3,45,2), KDateTime::UTC))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), KDateTime::UTC) == KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo))); QVERIFY(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,1), QTime(17,45,2), KDateTime::LocalZone)); // Date/time : date-only QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(0,0,0), cairo) == KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo) == KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo) == KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(0,0,0), cairo) == KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(0,0,0), cairo) == KDateTime(QDate(2004,3,1), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) == KDateTime(QDate(2004,3,1), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo) == KDateTime(QDate(2004,3,1), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo) == KDateTime(QDate(2004,3,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(0,0,0), cairo) == KDateTime(QDate(2004,3,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo) == KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo) == KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(10,0,1), cairo) == KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(9,59,59,999), cairo) == KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(10,0,0), cairo) == KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); // Date-only : date/time QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), QTime(0,0,0), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) == KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) == KDateTime(QDate(2004,3,3), QTime(0,0,0), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), QTime(0,0,0), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), QTime(3,45,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), QTime(23,59,59,999), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) == KDateTime(QDate(2004,3,1), QTime(23,59,59,999), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) == KDateTime(QDate(2004,3,3), QTime(0,0,0), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::LocalZone) == KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::LocalZone) == KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::LocalZone) == KDateTime(QDate(2004,3,3), QTime(9,59,59,999), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::LocalZone) == KDateTime(QDate(2004,3,3), QTime(10,0,0), cairo))); // Date-only values QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(2*3600)))); QVERIFY(!(KDateTime(QDate(2004,3,1), london) == KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(3*3600)))); QVERIFY(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), cairo) == KDateTime(QDate(2004,3,1), KDateTime::Spec::OffsetFromUTC(2*3600))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) == KDateTime(QDate(2004,3,1), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(3*3600)) == KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) == KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(2*3600)) == KDateTime(QDate(2004,3,1), cairo))); // Compare days when daylight savings changes occur QVERIFY(KDateTime(QDate(2005,3,27), london) == KDateTime(QDate(2005,3,27), london)); QVERIFY(!(KDateTime(QDate(2005,3,27), london) == KDateTime(QDate(2005,3,27), KDateTime::Spec::OffsetFromUTC(0)))); QVERIFY(KDateTime(QDate(2005,3,27), KDateTime::Spec::OffsetFromUTC(0)) == KDateTime(QDate(2005,3,27), KDateTime::Spec::OffsetFromUTC(0))); QVERIFY(!(KDateTime(QDate(2005,3,27), KDateTime::Spec::OffsetFromUTC(0)) == KDateTime(QDate(2005,3,27), london))); QVERIFY(KDateTime(QDate(2005,10,30), KDateTime::UTC) == KDateTime(QDate(2005,10,30), KDateTime::UTC)); QVERIFY(!(KDateTime(QDate(2005,10,30), london) == KDateTime(QDate(2005,10,30), KDateTime::UTC))); QVERIFY(!(KDateTime(QDate(2005,10,30), KDateTime::UTC) == KDateTime(QDate(2005,10,30), london))); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } ///////////////////////////////////////////////////////// // operator<() ///////////////////////////////////////////////////////// void KDateTimeTest::lessThan() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone cairo = KSystemTimeZones::zone("Africa/Cairo"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Date/time values QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,2,28), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,2,29), QTime(3,45,3), cairo))); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,1), QTime(3,45,3), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,2), QTime(3,45,3), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,3), QTime(3,45,3), cairo)); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,3), cairo) < KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo))); QVERIFY(KDateTime(QDate(2004,3,2), QTime(3,45,1), cairo) < KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo)); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,2,28), QTime(3,45,3), london))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,2,29), QTime(3,45,3), london))); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,1), QTime(3,45,3), london)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,2), QTime(3,45,3), london)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,3), QTime(3,45,3), london)); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), london) < KDateTime(QDate(2004,2,28), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), london) < KDateTime(QDate(2004,2,29), QTime(3,45,3), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), london) < KDateTime(QDate(2004,3,1), QTime(3,45,3), cairo))); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), london) < KDateTime(QDate(2004,3,2), QTime(3,45,3), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), london) < KDateTime(QDate(2004,3,3), QTime(3,45,3), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,1), QTime(3,45,2), KDateTime::UTC)); QVERIFY(!(KDateTime(QDate(2004,3,1), QTime(3,45,2), KDateTime::UTC) < KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,1), QTime(17,45,2), KDateTime::LocalZone))); QVERIFY(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,1), QTime(17,45,3), KDateTime::LocalZone)); // Date/time : date-only QVERIFY(KDateTime(QDate(2004,2,29), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo) < KDateTime(QDate(2004,3,2), cairo)); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(23,59,59,999), cairo) < KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,4), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,5), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), cairo))); QVERIFY(KDateTime(QDate(2004,2,29), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), london)); QVERIFY(KDateTime(QDate(2004,3,1), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), london)); QVERIFY(KDateTime(QDate(2004,3,2), QTime(1,59,59,999), cairo) < KDateTime(QDate(2004,3,2), london)); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(2,0,0), cairo) < KDateTime(QDate(2004,3,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo) < KDateTime(QDate(2004,3,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(23,59,59,999), cairo) < KDateTime(QDate(2004,3,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,4), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,5), QTime(0,0,0), cairo) < KDateTime(QDate(2004,3,2), london))); QVERIFY(KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo) < KDateTime(QDate(2004,3,2), KDateTime::LocalZone)); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo) < KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); QVERIFY(!(KDateTime(QDate(2004,3,2), QTime(10,0,1), cairo) < KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(9,59,59,999), cairo) < KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); QVERIFY(!(KDateTime(QDate(2004,3,3), QTime(10,0,0), cairo) < KDateTime(QDate(2004,3,2), KDateTime::LocalZone))); // Date-only : date/time QVERIFY(KDateTime(QDate(2004,2,28), cairo) < KDateTime(QDate(2004,3,2), QTime(0,0,0), cairo)); QVERIFY(KDateTime(QDate(2004,2,29), cairo) < KDateTime(QDate(2004,3,2), QTime(0,0,0), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,2), QTime(0,0,0), cairo)); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,2), QTime(0,0,0), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,2), QTime(23,59,59,999), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,3), cairo) < KDateTime(QDate(2004,3,2), QTime(23,59,59,999), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,4), cairo) < KDateTime(QDate(2004,3,2), QTime(0,0,0), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,5), cairo) < KDateTime(QDate(2004,3,2), QTime(0,0,0), cairo))); QVERIFY(KDateTime(QDate(2004,2,28), cairo) < KDateTime(QDate(2004,3,1), QTime(22,0,0), london)); QVERIFY(KDateTime(QDate(2004,2,29), cairo) < KDateTime(QDate(2004,3,1), QTime(22,0,0), london)); QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,1), QTime(22,0,0), london)); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,1), QTime(22,0,0), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,2), QTime(3,45,2), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,1), QTime(21,59,59,999), london))); QVERIFY(!(KDateTime(QDate(2004,3,3), cairo) < KDateTime(QDate(2004,3,1), QTime(21,59,59,999), london))); QVERIFY(!(KDateTime(QDate(2004,3,4), cairo) < KDateTime(QDate(2004,3,1), QTime(22,0,0), london))); QVERIFY(!(KDateTime(QDate(2004,3,5), cairo) < KDateTime(QDate(2004,3,1), QTime(22,0,0), london))); QVERIFY(KDateTime(QDate(2004,2,28), KDateTime::LocalZone) < KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo)); QVERIFY(KDateTime(QDate(2004,2,29), KDateTime::LocalZone) < KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo)); QVERIFY(!(KDateTime(QDate(2004,3,1), KDateTime::LocalZone) < KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo))); QVERIFY(KDateTime(QDate(2004,3,1), KDateTime::LocalZone) < KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo)); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::LocalZone) < KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,3), KDateTime::LocalZone) < KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,6), KDateTime::LocalZone) < KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo))); // Date-only values QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,2), cairo)); QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(2*3600))); QVERIFY(!(KDateTime(QDate(2004,3,1), london) < KDateTime(QDate(2004,3,2), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(3*3600)))); QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,3), KDateTime::Spec::OffsetFromUTC(3*3600))); QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,4), KDateTime::Spec::OffsetFromUTC(3*3600))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,1), KDateTime::Spec::OffsetFromUTC(2*3600)))); QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,5), london)); QVERIFY(KDateTime(QDate(2004,3,1), cairo) < KDateTime(QDate(2004,3,2), london)); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,1), london))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(3*3600)) < KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), cairo) < KDateTime(QDate(2004,3,1), cairo))); QVERIFY(!(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(2*3600)) < KDateTime(QDate(2004,3,1), cairo))); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } ///////////////////////////////////////////////////////// // compare() ///////////////////////////////////////////////////////// void KDateTimeTest::compare() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone cairo = KSystemTimeZones::zone("Africa/Cairo"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Date/time values QCOMPARE(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo).compare(KDateTime(QDate(2004,3,1), QTime(3,45,3), cairo)), KDateTime::Before); QCOMPARE(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo).compare(KDateTime(QDate(2004,3,1), QTime(3,45,2), KDateTime::UTC)), KDateTime::Before); QCOMPARE(KDateTime(QDate(2004,3,1), QTime(3,45,2), KDateTime::UTC).compare(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo)), KDateTime::After); QCOMPARE(KDateTime(QDate(2004,3,1), QTime(3,45,3), cairo).compare(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo)), KDateTime::After); QCOMPARE(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo).compare(KDateTime(QDate(2004,3,1), QTime(17,45,2), KDateTime::LocalZone)), KDateTime::Equal); QCOMPARE(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo).compare(KDateTime(QDate(2004,3,2), QTime(3,45,2), cairo)), KDateTime::Equal); // Date/time : date-only QCOMPARE(KDateTime(QDate(2004,3,1), QTime(0,0,0), cairo).compare(KDateTime(QDate(2004,3,1), cairo)), KDateTime::AtStart); QCOMPARE(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo).compare(KDateTime(QDate(2004,3,1), cairo)), KDateTime::Inside); QCOMPARE(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo).compare(KDateTime(QDate(2004,3,1), cairo)), KDateTime::AtEnd); QCOMPARE(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo).compare(KDateTime(QDate(2004,3,2), cairo)), KDateTime::Before); QCOMPARE(KDateTime(QDate(2004,3,3), QTime(0,0,0), cairo).compare(KDateTime(QDate(2004,3,2), cairo)), KDateTime::After); QCOMPARE(KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo).compare(KDateTime(QDate(2004,3,2), KDateTime::LocalZone)), KDateTime::Before); QCOMPARE(KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo).compare(KDateTime(QDate(2004,3,2), KDateTime::LocalZone)), KDateTime::AtStart); QCOMPARE(KDateTime(QDate(2004,3,2), QTime(10,0,1), cairo).compare(KDateTime(QDate(2004,3,2), KDateTime::LocalZone)), KDateTime::Inside); QCOMPARE(KDateTime(QDate(2004,3,3), QTime(9,59,59,999), cairo).compare(KDateTime(QDate(2004,3,2), KDateTime::LocalZone)), KDateTime::AtEnd); QCOMPARE(KDateTime(QDate(2004,3,3), QTime(10,0,0), cairo).compare(KDateTime(QDate(2004,3,2), KDateTime::LocalZone)), KDateTime::After); // Date-only : date/time QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,1), QTime(0,0,0), cairo)), KDateTime::StartsAt); QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,1), QTime(3,45,2), cairo)), KDateTime::Outside); QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo)), KDateTime::EndsAt); QCOMPARE(KDateTime(QDate(2004,3,2), cairo).compare(KDateTime(QDate(2004,3,1), QTime(23,59,59,999), cairo)), KDateTime::After); QCOMPARE(KDateTime(QDate(2004,3,2), cairo).compare(KDateTime(QDate(2004,3,3), QTime(0,0,0), cairo)), KDateTime::Before); QCOMPARE(KDateTime(QDate(2004,3,2), KDateTime::LocalZone).compare(KDateTime(QDate(2004,3,2), QTime(9,59,59,999), cairo)), KDateTime::After); QCOMPARE(KDateTime(QDate(2004,3,2), KDateTime::LocalZone).compare(KDateTime(QDate(2004,3,2), QTime(10,0,0), cairo)), KDateTime::StartsAt); QCOMPARE(KDateTime(QDate(2004,3,2), KDateTime::LocalZone).compare(KDateTime(QDate(2004,3,3), QTime(9,59,59,999), cairo)), KDateTime::EndsAt); QCOMPARE(KDateTime(QDate(2004,3,2), KDateTime::LocalZone).compare(KDateTime(QDate(2004,3,3), QTime(10,0,0), cairo)), KDateTime::Before); // Date-only values QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,2), cairo)), KDateTime::Before); QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(2*3600))), KDateTime::Before); QCOMPARE(KDateTime(QDate(2004,3,1), london).compare(KDateTime(QDate(2004,3,2), cairo)), static_cast(KDateTime::Before|KDateTime::AtStart|KDateTime::Inside)); QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(3*3600))), static_cast(KDateTime::Before|KDateTime::AtStart|KDateTime::Inside)); QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,1), cairo)), KDateTime::Equal); QCOMPARE(KDateTime(QDate(2004,3,1), cairo).compare(KDateTime(QDate(2004,3,1), KDateTime::Spec::OffsetFromUTC(2*3600))), KDateTime::Equal); QCOMPARE(KDateTime(QDate(2004,3,2), cairo).compare(KDateTime(QDate(2004,3,1), london)), static_cast(KDateTime::Inside|KDateTime::AtEnd|KDateTime::After)); QCOMPARE(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(3*3600)).compare(KDateTime(QDate(2004,3,1), cairo)), static_cast(KDateTime::Inside|KDateTime::AtEnd|KDateTime::After)); QCOMPARE(KDateTime(QDate(2004,3,2), cairo).compare(KDateTime(QDate(2004,3,1), cairo)), KDateTime::After); QCOMPARE(KDateTime(QDate(2004,3,2), KDateTime::Spec::OffsetFromUTC(2*3600)).compare(KDateTime(QDate(2004,3,1), cairo)), KDateTime::After); // Compare days when daylight savings changes occur QCOMPARE(KDateTime(QDate(2005,3,27), london).compare(KDateTime(QDate(2005,3,27), KDateTime::Spec::OffsetFromUTC(0))), static_cast(KDateTime::AtStart|KDateTime::Inside)); QCOMPARE(KDateTime(QDate(2005,3,27), KDateTime::Spec::OffsetFromUTC(0)).compare(KDateTime(QDate(2005,3,27), london)), KDateTime::StartsAt); QCOMPARE(KDateTime(QDate(2005,10,30), london).compare(KDateTime(QDate(2005,10,30), KDateTime::UTC)), KDateTime::EndsAt); QCOMPARE(KDateTime(QDate(2005,10,30), KDateTime::UTC).compare(KDateTime(QDate(2005,10,30), london)), static_cast(KDateTime::Inside|KDateTime::AtEnd)); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } ///////////////////////////////////////////////////////// // Addition and subtraction methods, and operator<() etc. ///////////////////////////////////////////////////////// void KDateTimeTest::addSubtract() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone losAngeles = KSystemTimeZones::zone("America/Los_Angeles"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // UTC KDateTime utc1(QDate(2005,7,6), QTime(3,40,0), KDateTime::UTC); KDateTime utc2 = utc1.addSecs(184 * 86400); QVERIFY(utc2.isUtc()); QCOMPARE(utc2.dateTime(), QDateTime(QDate(2006,1,6), QTime(3,40,0), Qt::UTC)); KDateTime utc3 = utc1.addDays(184); QVERIFY(utc3.isUtc()); QCOMPARE(utc2.dateTime(), utc3.dateTime()); KDateTime utc4 = utc1.addMonths(6); QVERIFY(utc4.isUtc()); QCOMPARE(utc2.dateTime(), utc4.dateTime()); KDateTime utc5 = utc1.addYears(4); QVERIFY(utc5.isUtc()); QCOMPARE(utc5.dateTime(), QDateTime(QDate(2009,7,6), QTime(3,40,0), Qt::UTC)); QCOMPARE(utc1.secsTo(utc2), 184 * 86400); QCOMPARE(utc1.secsTo(utc3), 184 * 86400); QCOMPARE(utc1.daysTo(utc2), 184); QVERIFY(utc1 < utc2); QVERIFY(!(utc2 < utc1)); QVERIFY(utc2 == utc3); // UTC offset KDateTime offset1(QDate(2005,7,6), QTime(3,40,0), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime offset2 = offset1.addSecs(184 * 86400); QVERIFY(offset2.isOffsetFromUtc()); QCOMPARE(offset2.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), QDateTime(QDate(2006,1,6), QTime(3,40,0), Qt::LocalTime)); KDateTime offset3 = offset1.addDays(184); QVERIFY(offset3.isOffsetFromUtc()); QCOMPARE(offset3.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), offset3.dateTime()); KDateTime offset4 = offset1.addMonths(6); QVERIFY(offset4.isOffsetFromUtc()); QCOMPARE(offset4.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), offset4.dateTime()); KDateTime offset5 = offset1.addYears(4); QVERIFY(offset5.isOffsetFromUtc()); QCOMPARE(offset5.utcOffset(), -5400); QCOMPARE(offset5.dateTime(), QDateTime(QDate(2009,7,6), QTime(3,40,0), Qt::LocalTime)); QCOMPARE(offset1.secsTo(offset2), 184 * 86400); QCOMPARE(offset1.secsTo(offset3), 184 * 86400); QCOMPARE(offset1.daysTo(offset2), 184); QVERIFY(offset1 < offset2); QVERIFY(!(offset2 < offset1)); QVERIFY(offset2 == offset3); // Zone KDateTime zone1(QDate(2005,7,6), QTime(3,40,0), london); KDateTime zone2 = zone1.addSecs(184 * 86400); QCOMPARE(zone2.timeZone(), london); QCOMPARE(zone2.dateTime(), QDateTime(QDate(2006,1,6), QTime(2,40,0), Qt::LocalTime)); KDateTime zone3 = zone1.addDays(184); QCOMPARE(zone3.timeZone(), london); QCOMPARE(zone3.dateTime(), QDateTime(QDate(2006,1,6), QTime(3,40,0), Qt::LocalTime)); KDateTime zone4 = zone1.addMonths(6); QCOMPARE(zone4.timeZone(), london); QCOMPARE(zone4.dateTime(), zone3.dateTime()); KDateTime zone5 = zone1.addYears(4); QCOMPARE(zone5.timeZone(), london); QCOMPARE(zone5.dateTime(), QDateTime(QDate(2009,7,6), QTime(3,40,0), Qt::LocalTime)); QCOMPARE(zone1.secsTo(zone2), 184 * 86400); QCOMPARE(zone1.secsTo(zone3), 184 * 86400 + 3600); QCOMPARE(zone1.daysTo(zone2), 184); QCOMPARE(zone1.daysTo(zone3), 184); QVERIFY(zone1 < zone2); QVERIFY(!(zone2 < zone1)); QVERIFY(!(zone2 == zone3)); // Local zone KDateTime local1(QDate(2005,7,6), QTime(3,40,0), KDateTime::LocalZone); KDateTime local2 = local1.addSecs(184 * 86400); QVERIFY(local2.isLocalZone()); QCOMPARE(local2.timeZone(), losAngeles); QCOMPARE(local2.dateTime(), QDateTime(QDate(2006,1,6), QTime(2,40,0), Qt::LocalTime)); KDateTime local3 = local1.addDays(184); QVERIFY(local3.isLocalZone()); QCOMPARE(local3.dateTime(), QDateTime(QDate(2006,1,6), QTime(3,40,0), Qt::LocalTime)); KDateTime local4 = local1.addMonths(6); QVERIFY(local4.isLocalZone()); QCOMPARE(local4.dateTime(), local3.dateTime()); KDateTime local5 = local1.addYears(4); QVERIFY(local5.isLocalZone()); QCOMPARE(local5.dateTime(), QDateTime(QDate(2009,7,6), QTime(3,40,0), Qt::LocalTime)); QCOMPARE(local1.secsTo(local2), 184 * 86400); QCOMPARE(local1.secsTo(local3), 184 * 86400 + 3600); QCOMPARE(local1.daysTo(local2), 184); QCOMPARE(local1.daysTo(local3), 184); QVERIFY(local1 < local2); QVERIFY(!(local2 < local1)); QVERIFY(!(local2 == local3)); // Clock time KDateTime clock1(QDate(2005,7,6), QTime(3,40,0), KDateTime::ClockTime); KDateTime clock2 = clock1.addSecs(184 * 86400); QVERIFY(clock2.isClockTime()); QCOMPARE(clock2.dateTime(), QDateTime(QDate(2006,1,6), QTime(3,40,0), Qt::LocalTime)); KDateTime clock3 = clock1.addDays(184); QVERIFY(clock3.isClockTime()); QCOMPARE(clock2.dateTime(), clock3.dateTime()); KDateTime clock4 = clock1.addMonths(6); QVERIFY(clock4.isClockTime()); QCOMPARE(clock2.dateTime(), clock4.dateTime()); KDateTime clock5 = clock1.addYears(4); QVERIFY(clock5.isClockTime()); QCOMPARE(clock5.dateTime(), QDateTime(QDate(2009,7,6), QTime(3,40,0), Qt::LocalTime)); QCOMPARE(clock1.secsTo(clock2), 184 * 86400); QCOMPARE(clock1.secsTo(clock3), 184 * 86400); QCOMPARE(clock1.daysTo(clock2), 184); QCOMPARE(clock1.daysTo(clock3), 184); QVERIFY(clock1 < clock2); QVERIFY(!(clock2 < clock1)); QVERIFY(clock2 == clock3); // Mixed timeSpecs QCOMPARE(utc1.secsTo(offset1), 5400); QCOMPARE(utc1.secsTo(offset2), 184 * 86400 + 5400); QCOMPARE(offset2.secsTo(utc1), -(184 * 86400 + 5400)); QVERIFY(utc1 < offset1); QVERIFY(utc1 <= offset1); QVERIFY(!(offset1 < utc1)); QVERIFY(!(offset1 <= utc1)); QCOMPARE(utc1.secsTo(zone1), -3600); QCOMPARE(utc1.secsTo(zone2), 184 * 86400 - 3600); QCOMPARE(zone2.secsTo(utc1), -(184 * 86400 - 3600)); QVERIFY(utc1 > zone1); QVERIFY(utc1 >= zone1); QVERIFY(!(zone1 > utc1)); QVERIFY(!(zone1 >= utc1)); QCOMPARE(utc1.secsTo(local1), 7 * 3600); QCOMPARE(utc1.secsTo(local2), 184 * 86400 + 7 * 3600); QCOMPARE(local2.secsTo(utc1), -(184 * 86400 + 7 * 3600)); QVERIFY(utc1 < local1); QVERIFY(utc1 <= local1); QVERIFY(!(local1 < utc1)); QVERIFY(!(local1 <= utc1)); QCOMPARE(utc1.secsTo(clock1), 7 * 3600); QCOMPARE(utc1.secsTo(clock2), 184 * 86400 + 8 * 3600); QCOMPARE(clock2.secsTo(utc1), -(184 * 86400 + 8 * 3600)); QVERIFY(utc1 < clock1); QVERIFY(utc1 <= clock1); QVERIFY(!(clock1 < utc1)); QVERIFY(!(clock1 <= utc1)); QCOMPARE(offset1.secsTo(zone1), -9000); QCOMPARE(offset1.secsTo(zone2), 184 * 86400 -9000); QCOMPARE(zone2.secsTo(offset1), -(184 * 86400 - 9000)); QVERIFY(offset1 > zone1); QVERIFY(offset1 >= zone1); QVERIFY(!(zone1 > offset1)); QVERIFY(!(zone1 >= offset1)); QCOMPARE(offset1.secsTo(local1), 7*3600 - 5400); QCOMPARE(offset1.secsTo(local2), 184 * 86400 + 7*3600 - 5400); QCOMPARE(local2.secsTo(offset1), -(184 * 86400 + 7*3600 - 5400)); QVERIFY(offset1 < local1); QVERIFY(offset1 <= local1); QVERIFY(!(local1 < offset1)); QVERIFY(!(local1 <= offset1)); QCOMPARE(offset1.secsTo(clock1), 7*3600 - 5400); QCOMPARE(offset1.secsTo(clock2), 184 * 86400 + 8*3600 - 5400); QCOMPARE(clock2.secsTo(offset1), -(184 * 86400 + 8*3600 - 5400)); QVERIFY(offset1 < clock1); QVERIFY(offset1 <= clock1); QVERIFY(!(clock1 < offset1)); QVERIFY(!(clock1 <= offset1)); QCOMPARE(zone1.secsTo(local1), 8*3600); QCOMPARE(zone1.secsTo(local2), 184 * 86400 + 8*3600); QCOMPARE(local2.secsTo(zone1), -(184 * 86400 + 8*3600)); QVERIFY(zone1 < local1); QVERIFY(zone1 <= local1); QVERIFY(!(local1 < zone1)); QVERIFY(!(local1 <= zone1)); QCOMPARE(zone1.secsTo(clock1), 8*3600); QCOMPARE(zone1.secsTo(clock2), 184 * 86400 + 9*3600); QCOMPARE(clock2.secsTo(zone1), -(184 * 86400 + 9*3600)); QVERIFY(zone1 < clock1); QVERIFY(zone1 <= clock1); QVERIFY(!(clock1 < zone1)); QVERIFY(!(clock1 <= zone1)); QCOMPARE(local1.secsTo(clock1), 0); QCOMPARE(local1.secsTo(clock2), 184 * 86400 + 3600); QCOMPARE(clock2.secsTo(local1), -(184 * 86400 + 3600)); QVERIFY(local1 == clock1); QVERIFY(local1 <= clock1); QVERIFY(local1 >= clock1); QVERIFY(!(local1 < clock1)); QVERIFY(!(local1 > clock1)); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::addMSecs() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone losAngeles = KSystemTimeZones::zone("America/Los_Angeles"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // UTC KDateTime utc1(QDate(2005,7,6), QTime(23,59,0,100), KDateTime::UTC); KDateTime utc2 = utc1.addMSecs(59899); QVERIFY(utc2.isUtc()); QCOMPARE(utc2.dateTime(), QDateTime(QDate(2005,7,6), QTime(23,59,59,999), Qt::UTC)); utc2 = utc1.addMSecs(59900); QVERIFY(utc2.isUtc()); QCOMPARE(utc2.dateTime(), QDateTime(QDate(2005,7,7), QTime(0,0,0,0), Qt::UTC)); KDateTime utc1a(QDate(2005,7,6), QTime(0,0,5,100), KDateTime::UTC); utc2 = utc1a.addMSecs(-5100); QVERIFY(utc2.isUtc()); QCOMPARE(utc2.dateTime(), QDateTime(QDate(2005,7,6), QTime(0,0,0,0), Qt::UTC)); utc2 = utc1a.addMSecs(-5101); QVERIFY(utc2.isUtc()); QCOMPARE(utc2.dateTime(), QDateTime(QDate(2005,7,5), QTime(23,59,59,999), Qt::UTC)); // UTC offset KDateTime offset1(QDate(2005,7,6), QTime(3,40,0,100), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime offset2 = offset1.addMSecs(5899); QVERIFY(offset2.isOffsetFromUtc()); QCOMPARE(offset2.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), QDateTime(QDate(2005,7,6), QTime(3,40,5,999), Qt::LocalTime)); offset2 = offset1.addMSecs(5900); QVERIFY(offset2.isOffsetFromUtc()); QCOMPARE(offset2.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), QDateTime(QDate(2005,7,6), QTime(3,40,6,0), Qt::LocalTime)); offset2 = offset1.addMSecs(-5100); QVERIFY(offset2.isOffsetFromUtc()); QCOMPARE(offset2.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), QDateTime(QDate(2005,7,6), QTime(3,39,55,0), Qt::LocalTime)); offset2 = offset1.addMSecs(-5101); QVERIFY(offset2.isOffsetFromUtc()); QCOMPARE(offset2.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), QDateTime(QDate(2005,7,6), QTime(3,39,54,999), Qt::LocalTime)); // Zone KDateTime zone1(QDate(2002,3,31), QTime(0,40,0,100), london); // time changes at 01:00 UTC KDateTime zone2 = zone1.addMSecs(3600*1000+899); QCOMPARE(zone2.timeZone(), london); QCOMPARE(zone2.dateTime(), QDateTime(QDate(2002,3,31), QTime(2,40,0,999), Qt::LocalTime)); zone2 = zone1.addMSecs(3600*1000+900); QCOMPARE(zone2.timeZone(), london); QCOMPARE(zone2.dateTime(), QDateTime(QDate(2002,3,31), QTime(2,40,1,0), Qt::LocalTime)); KDateTime zone1a(QDate(2002,3,31), QTime(2,40,0,100), london); // time changes at 01:00 UTC zone2 = zone1a.addMSecs(-(3600*1000+100)); QCOMPARE(zone2.timeZone(), london); QCOMPARE(zone2.dateTime(), QDateTime(QDate(2002,3,31), QTime(0,40,0,0), Qt::LocalTime)); zone2 = zone1a.addMSecs(-(3600*1000+101)); QCOMPARE(zone2.timeZone(), london); QCOMPARE(zone2.dateTime(), QDateTime(QDate(2002,3,31), QTime(0,39,59,999), Qt::LocalTime)); // Local zone KDateTime local1(QDate(2002,4,7), QTime(1,59,0,100), KDateTime::LocalZone); // time changes at 02:00 local KDateTime local2 = local1.addMSecs(59899); QVERIFY(local2.isLocalZone()); QCOMPARE(local2.timeZone(), losAngeles); QCOMPARE(local2.dateTime(), QDateTime(QDate(2002,4,7), QTime(1,59,59,999), Qt::LocalTime)); local2 = local1.addMSecs(59900); QVERIFY(local2.isLocalZone()); QCOMPARE(local2.timeZone(), losAngeles); QCOMPARE(local2.dateTime(), QDateTime(QDate(2002,4,7), QTime(3,0,0,0), Qt::LocalTime)); KDateTime local1a(QDate(2002,4,7), QTime(3,0,0,100), KDateTime::LocalZone); // time changes at 02:00 local local2 = local1a.addMSecs(-100); QVERIFY(local2.isLocalZone()); QCOMPARE(local2.timeZone(), losAngeles); QCOMPARE(local2.dateTime(), QDateTime(QDate(2002,4,7), QTime(3,0,0,0), Qt::LocalTime)); local2 = local1a.addMSecs(-101); QVERIFY(local2.isLocalZone()); QCOMPARE(local2.timeZone(), losAngeles); QCOMPARE(local2.dateTime(), QDateTime(QDate(2002,4,7), QTime(1,59,59,999), Qt::LocalTime)); // Clock time KDateTime clock1(QDate(2002,4,7), QTime(1,59,0,100), KDateTime::ClockTime); KDateTime clock2 = clock1.addMSecs(59899); QVERIFY(clock2.isClockTime()); QCOMPARE(clock2.dateTime(), QDateTime(QDate(2002,4,7), QTime(1,59,59,999), Qt::LocalTime)); clock2 = clock1.addMSecs(59900); QVERIFY(clock2.isClockTime()); QCOMPARE(clock2.dateTime(), QDateTime(QDate(2002,4,7), QTime(2,0,0,0), Qt::LocalTime)); KDateTime clock1a(QDate(2002,4,7), QTime(0,0,0,100), KDateTime::ClockTime); clock2 = clock1a.addMSecs(-100); QVERIFY(clock2.isClockTime()); QCOMPARE(clock2.dateTime(), QDateTime(QDate(2002,4,7), QTime(0,0,0,0), Qt::LocalTime)); clock2 = clock1a.addMSecs(-101); QVERIFY(clock2.isClockTime()); QCOMPARE(clock2.dateTime(), QDateTime(QDate(2002,4,6), QTime(23,59,59,999), Qt::LocalTime)); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::addSubtractDate() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone losAngeles = KSystemTimeZones::zone("America/Los_Angeles"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // UTC KDateTime utc1(QDate(2005,7,6), KDateTime::UTC); KDateTime utc2 = utc1.addSecs(184 * 86400 + 100); QVERIFY(utc2.isUtc()); QVERIFY(utc2.isDateOnly()); QCOMPARE(utc2.dateTime(), QDateTime(QDate(2006,1,6), QTime(0,0,0), Qt::UTC)); KDateTime utc3 = utc1.addDays(184); QVERIFY(utc3.isUtc()); QVERIFY(utc3.isDateOnly()); QCOMPARE(utc2.dateTime(), utc3.dateTime()); KDateTime utc4 = utc1.addMonths(6); QVERIFY(utc4.isUtc()); QVERIFY(utc4.isDateOnly()); QCOMPARE(utc2.dateTime(), utc4.dateTime()); KDateTime utc5 = utc1.addYears(4); QVERIFY(utc5.isUtc()); QVERIFY(utc5.isDateOnly()); QCOMPARE(utc5.dateTime(), QDateTime(QDate(2009,7,6), QTime(0,0,0), Qt::UTC)); QCOMPARE(utc1.secsTo(utc2), 184 * 86400); QCOMPARE(utc1.secsTo(utc3), 184 * 86400); QCOMPARE(utc1.daysTo(utc2), 184); QVERIFY(utc1 < utc2); QVERIFY(!(utc2 < utc1)); QVERIFY(utc2 == utc3); // UTC offset KDateTime offset1(QDate(2005,7,6), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 KDateTime offset2 = offset1.addSecs(184 * 86400); QVERIFY(offset2.isDateOnly()); QVERIFY(offset2.isOffsetFromUtc()); QCOMPARE(offset2.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), QDateTime(QDate(2006,1,6), QTime(0,0,0), Qt::LocalTime)); KDateTime offset3 = offset1.addDays(184); QVERIFY(offset3.isDateOnly()); QVERIFY(offset3.isOffsetFromUtc()); QCOMPARE(offset3.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), offset3.dateTime()); KDateTime offset4 = offset1.addMonths(6); QVERIFY(offset4.isDateOnly()); QVERIFY(offset4.isOffsetFromUtc()); QCOMPARE(offset4.utcOffset(), -5400); QCOMPARE(offset2.dateTime(), offset4.dateTime()); KDateTime offset5 = offset1.addYears(4); QVERIFY(offset5.isDateOnly()); QVERIFY(offset5.isOffsetFromUtc()); QCOMPARE(offset5.utcOffset(), -5400); QCOMPARE(offset5.dateTime(), QDateTime(QDate(2009,7,6), QTime(0,0,0), Qt::LocalTime)); QCOMPARE(offset1.secsTo(offset2), 184 * 86400); QCOMPARE(offset1.secsTo(offset3), 184 * 86400); QCOMPARE(offset1.daysTo(offset2), 184); QVERIFY(offset1 < offset2); QVERIFY(!(offset2 < offset1)); QVERIFY(offset2 == offset3); // Zone KDateTime zone1(QDate(2005,7,6), london); KDateTime zone2 = zone1.addSecs(184 * 86400); QVERIFY(zone2.isDateOnly()); QCOMPARE(zone2.timeZone(), london); QCOMPARE(zone2.dateTime(), QDateTime(QDate(2006,1,6), QTime(0,0,0), Qt::LocalTime)); KDateTime zone3 = zone1.addDays(184); QVERIFY(zone3.isDateOnly()); QCOMPARE(zone3.timeZone(), london); QCOMPARE(zone3.dateTime(), QDateTime(QDate(2006,1,6), QTime(0,0,0), Qt::LocalTime)); KDateTime zone4 = zone1.addMonths(6); QVERIFY(zone4.isDateOnly()); QCOMPARE(zone4.timeZone(), london); QCOMPARE(zone4.dateTime(), zone3.dateTime()); KDateTime zone5 = zone1.addYears(4); QVERIFY(zone5.isDateOnly()); QCOMPARE(zone5.timeZone(), london); QCOMPARE(zone5.dateTime(), QDateTime(QDate(2009,7,6), QTime(0,0,0), Qt::LocalTime)); QCOMPARE(zone1.secsTo(zone2), 184 * 86400); QCOMPARE(zone1.secsTo(zone3), 184 * 86400); QCOMPARE(zone1.daysTo(zone2), 184); QCOMPARE(zone1.daysTo(zone3), 184); QVERIFY(zone1 < zone2); QVERIFY(!(zone2 < zone1)); QVERIFY(zone2 == zone3); // Local zone KDateTime local1(QDate(2005,7,6), KDateTime::LocalZone); KDateTime local2 = local1.addSecs(184 * 86400); QVERIFY(local2.isDateOnly()); QVERIFY(local2.isLocalZone()); QCOMPARE(local2.timeZone(), losAngeles); QCOMPARE(local2.dateTime(), QDateTime(QDate(2006,1,6), QTime(0,0,0), Qt::LocalTime)); KDateTime local3 = local1.addDays(184); QVERIFY(local3.isDateOnly()); QVERIFY(local3.isLocalZone()); QCOMPARE(local3.dateTime(), QDateTime(QDate(2006,1,6), QTime(0,0,0), Qt::LocalTime)); KDateTime local4 = local1.addMonths(6); QVERIFY(local4.isDateOnly()); QVERIFY(local4.isLocalZone()); QCOMPARE(local4.dateTime(), local3.dateTime()); KDateTime local5 = local1.addYears(4); QVERIFY(local5.isDateOnly()); QVERIFY(local5.isLocalZone()); QCOMPARE(local5.dateTime(), QDateTime(QDate(2009,7,6), QTime(0,0,0), Qt::LocalTime)); QCOMPARE(local1.secsTo(local2), 184 * 86400); QCOMPARE(local1.secsTo(local3), 184 * 86400); QCOMPARE(local1.daysTo(local2), 184); QCOMPARE(local1.daysTo(local3), 184); QVERIFY(local1 < local2); QVERIFY(!(local2 < local1)); QVERIFY(local2 == local3); // Clock time KDateTime clock1(QDate(2005,7,6), KDateTime::ClockTime); KDateTime clock2 = clock1.addSecs(184 * 86400); QVERIFY(clock2.isDateOnly()); QVERIFY(clock2.isClockTime()); QCOMPARE(clock2.dateTime(), QDateTime(QDate(2006,1,6), QTime(0,0,0), Qt::LocalTime)); KDateTime clock3 = clock1.addDays(184); QVERIFY(clock3.isDateOnly()); QVERIFY(clock3.isClockTime()); QCOMPARE(clock2.dateTime(), clock3.dateTime()); KDateTime clock4 = clock1.addMonths(6); QVERIFY(clock4.isDateOnly()); QVERIFY(clock4.isClockTime()); QCOMPARE(clock2.dateTime(), clock4.dateTime()); KDateTime clock5 = clock1.addYears(4); QVERIFY(clock5.isDateOnly()); QVERIFY(clock5.isClockTime()); QCOMPARE(clock5.dateTime(), QDateTime(QDate(2009,7,6), QTime(0,0,0), Qt::LocalTime)); QCOMPARE(clock1.secsTo(clock2), 184 * 86400); QCOMPARE(clock1.secsTo(clock3), 184 * 86400); QCOMPARE(clock1.daysTo(clock2), 184); QCOMPARE(clock1.daysTo(clock3), 184); QVERIFY(clock1 < clock2); QVERIFY(!(clock2 < clock1)); QVERIFY(clock2 == clock3); // Mixed timeSpecs QCOMPARE(utc1.secsTo(offset1), 0); QCOMPARE(utc1.secsTo(offset2), 184 * 86400); QCOMPARE(offset2.secsTo(utc1), -(184 * 86400)); QVERIFY(!(utc1 < offset1)); QVERIFY(utc1 <= offset1); QVERIFY(!(offset1 < utc1)); QVERIFY(offset1 <= utc1); QCOMPARE(utc1.secsTo(zone1), 0); QCOMPARE(utc1.secsTo(zone2), 184 * 86400); QCOMPARE(zone2.secsTo(utc1), -(184 * 86400)); QVERIFY(!(utc1 > zone1)); QVERIFY(utc1 >= zone1); QVERIFY(!(zone1 > utc1)); QVERIFY(zone1 >= utc1); QCOMPARE(utc1.secsTo(local1), 0); QCOMPARE(utc1.secsTo(local2), 184 * 86400); QCOMPARE(local2.secsTo(utc1), -(184 * 86400)); QVERIFY(!(utc1 < local1)); QVERIFY(utc1 <= local1); QVERIFY(!(local1 < utc1)); QVERIFY(local1 <= utc1); QCOMPARE(utc1.secsTo(clock1), 0); QCOMPARE(utc1.secsTo(clock2), 184 * 86400); QCOMPARE(clock2.secsTo(utc1), -(184 * 86400)); QVERIFY(!(utc1 < clock1)); QVERIFY(utc1 <= clock1); QVERIFY(!(clock1 < utc1)); QVERIFY(clock1 <= utc1); QCOMPARE(offset1.secsTo(zone1), 0); QCOMPARE(offset1.secsTo(zone2), 184 * 86400); QCOMPARE(zone2.secsTo(offset1), -(184 * 86400)); QVERIFY(!(offset1 > zone1)); QVERIFY(offset1 >= zone1); QVERIFY(!(zone1 > offset1)); QVERIFY(zone1 >= offset1); QCOMPARE(offset1.secsTo(local1), 0); QCOMPARE(offset1.secsTo(local2), 184 * 86400); QCOMPARE(local2.secsTo(offset1), -(184 * 86400)); QVERIFY(!(offset1 < local1)); QVERIFY(offset1 <= local1); QVERIFY(!(local1 < offset1)); QVERIFY(local1 <= offset1); QCOMPARE(offset1.secsTo(clock1), 0); QCOMPARE(offset1.secsTo(clock2), 184 * 86400); QCOMPARE(clock2.secsTo(offset1), -(184 * 86400)); QVERIFY(!(offset1 < clock1)); QVERIFY(offset1 <= clock1); QVERIFY(!(clock1 < offset1)); QVERIFY(clock1 <= offset1); QCOMPARE(zone1.secsTo(local1), 0); QCOMPARE(zone1.secsTo(local2), 184 * 86400); QCOMPARE(local2.secsTo(zone1), -(184 * 86400)); QVERIFY(!(zone1 < local1)); QVERIFY(zone1 <= local1); QVERIFY(!(local1 < zone1)); QVERIFY(local1 <= zone1); QCOMPARE(zone1.secsTo(clock1), 0); QCOMPARE(zone1.secsTo(clock2), 184 * 86400); QCOMPARE(clock2.secsTo(zone1), -(184 * 86400)); QVERIFY(!(zone1 < clock1)); QVERIFY(zone1 <= clock1); QVERIFY(!(clock1 < zone1)); QVERIFY(clock1 <= zone1); QCOMPARE(local1.secsTo(clock1), 0); QCOMPARE(local1.secsTo(clock2), 184 * 86400); QCOMPARE(clock2.secsTo(local1), -(184 * 86400)); QVERIFY(local1 == clock1); QVERIFY(local1 <= clock1); QVERIFY(local1 >= clock1); QVERIFY(!(local1 < clock1)); QVERIFY(!(local1 > clock1)); // Mixed date/time and date-only // UTC utc3.setTime(QTime(13,14,15)); QVERIFY(!utc3.isDateOnly()); QCOMPARE(utc3.time(), QTime(13,14,15)); QCOMPARE(utc1.secsTo(utc3), 184 * 86400); KDateTime utc1t(QDate(2005,7,6), QTime(3,40,0), KDateTime::UTC); QCOMPARE(utc1t.secsTo(utc2), 184 * 86400); // UTC offset offset3.setTime(QTime(13,14,15)); QVERIFY(!offset3.isDateOnly()); QCOMPARE(offset3.time(), QTime(13,14,15)); QCOMPARE(offset1.secsTo(offset3), 184 * 86400); KDateTime offset1t(QDate(2005,7,6), QTime(3,40,0), KDateTime::Spec::OffsetFromUTC(-5400)); // -0130 QCOMPARE(offset1t.secsTo(offset2), 184 * 86400); KDateTime offset2t(QDate(2005,7,6), QTime(0,40,0), KDateTime::Spec::OffsetFromUTC(5400)); // +0130 // Zone zone3.setTime(QTime(13,14,15)); QVERIFY(!zone3.isDateOnly()); QCOMPARE(zone3.time(), QTime(13,14,15)); QCOMPARE(zone1.secsTo(zone3), 184 * 86400); KDateTime zone1t(QDate(2005,7,6), QTime(3,40,0), london); QCOMPARE(zone1t.secsTo(zone2), 184 * 86400); // Local zone local3.setTime(QTime(13,14,15)); QVERIFY(!local3.isDateOnly()); QCOMPARE(local3.time(), QTime(13,14,15)); QCOMPARE(local1.secsTo(local3), 184 * 86400); KDateTime local1t(QDate(2005,7,6), QTime(3,40,0), KDateTime::LocalZone); QCOMPARE(local1t.secsTo(local2), 184 * 86400); KDateTime local2t(QDate(2005,7,5), QTime(23,40,0), KDateTime::LocalZone); // Clock time clock3.setTime(QTime(13,14,15)); QVERIFY(!clock3.isDateOnly()); QCOMPARE(clock3.time(), QTime(13,14,15)); QCOMPARE(clock1.secsTo(clock3), 184 * 86400); KDateTime clock1t(QDate(2005,7,6), QTime(3,40,0), KDateTime::ClockTime); QCOMPARE(clock1t.secsTo(clock2), 184 * 86400); // Mixed timeSpecs QCOMPARE(utc1t.secsTo(offset1), 0); QVERIFY(utc1t != offset1); QVERIFY(offset1 != utc1t); QVERIFY(!(utc1t < offset1)); QVERIFY(utc1t <= offset1); QVERIFY(!(offset1 < utc1t)); QVERIFY(offset1 <= utc1t); QCOMPARE(utc1.secsTo(offset2t), -86400); QCOMPARE(offset2t.secsTo(utc1), 86400); QVERIFY(utc1 != offset2t); QVERIFY(offset2t != utc1); QVERIFY(utc1 > offset2t); QVERIFY(utc1 >= offset2t); QVERIFY(offset2t < utc1); QVERIFY(offset2t <= utc1); QCOMPARE(utc1t.secsTo(offset2), 184 * 86400); QCOMPARE(offset2.secsTo(utc1t), -(184 * 86400)); QCOMPARE(utc1t.secsTo(zone1), 0); QVERIFY(utc1t != zone1); QVERIFY(zone1 != utc1t); QVERIFY(!(utc1t < zone1)); QVERIFY(!(utc1t > zone1)); QVERIFY(!(zone1 < utc1t)); QVERIFY(!(zone1 > utc1t)); QCOMPARE(utc1t.secsTo(zone2), 184 * 86400); QCOMPARE(zone2.secsTo(utc1t), -(184 * 86400)); QVERIFY(utc1t != zone2); QVERIFY(zone2 != utc1t); QVERIFY(utc1t < zone2); QVERIFY(utc1t <= zone2); QVERIFY(!(zone2 < utc1t)); QVERIFY(!(zone2 <= utc1t)); QCOMPARE(utc1t.secsTo(local1), 86400); QCOMPARE(utc1t.secsTo(local2), 185 * 86400); QCOMPARE(local2.secsTo(utc1t), -(185 * 86400)); QVERIFY(utc1t != local1); QVERIFY(local1 != utc1t); QVERIFY(utc1t < local1); QVERIFY(utc1t <= local1); QVERIFY(!(local1 < utc1t)); QVERIFY(!(local1 <= utc1t)); QCOMPARE(utc1.secsTo(local2t), 0); QCOMPARE(local2t.secsTo(utc1), 0); QVERIFY(utc1 != local2t); QVERIFY(local2t != utc1); QVERIFY(!(utc1 < local2t)); QVERIFY(utc1 <= local2t); QVERIFY(!(local2t < utc1)); QVERIFY(local2t <= utc1); QCOMPARE(utc1t.secsTo(clock1), 86400); QCOMPARE(utc1t.secsTo(clock2), 185 * 86400); QCOMPARE(clock2.secsTo(utc1t), -(185 * 86400)); QVERIFY(utc1t != clock1); QVERIFY(clock1 != utc1t); QVERIFY(utc1t < clock1); QVERIFY(utc1t <= clock1); QVERIFY(!(clock1 < utc1t)); QVERIFY(!(clock1 <= utc1t)); QCOMPARE(offset1t.secsTo(zone1), 0); QCOMPARE(offset1t.secsTo(zone2), 184 * 86400); QCOMPARE(zone2.secsTo(offset1t), -(184 * 86400)); QVERIFY(offset1t != zone1); QVERIFY(zone1 != offset1t); QVERIFY(!(offset1t > zone1)); QVERIFY(offset1t >= zone1); QVERIFY(!(zone1 > offset1t)); QVERIFY(zone1 >= offset1t); QCOMPARE(offset1t.secsTo(local1), 86400); QCOMPARE(offset1t.secsTo(local2), 185 * 86400); QCOMPARE(local2.secsTo(offset1t), -(185 * 86400)); QVERIFY(offset1t != local1); QVERIFY(local1 != offset1t); QVERIFY(offset1t < local1); QVERIFY(offset1t <= local1); QVERIFY(!(local1 < offset1t)); QVERIFY(!(local1 <= offset1t)); QCOMPARE(offset1t.secsTo(clock1), 86400); QCOMPARE(offset1t.secsTo(clock2), 185 * 86400); QCOMPARE(clock2.secsTo(offset1t), -(185 * 86400)); QVERIFY(offset1t != clock1); QVERIFY(clock1 != offset1t); QVERIFY(offset1t < clock1); QVERIFY(offset1t <= clock1); QVERIFY(!(clock1 < offset1t)); QVERIFY(!(clock1 <= offset1t)); QCOMPARE(zone1t.secsTo(local1), 86400); QCOMPARE(zone1t.secsTo(local2), 185 * 86400); QCOMPARE(local2.secsTo(zone1t), -(185 * 86400)); QVERIFY(zone1t != local1); QVERIFY(local1 != zone1t); QVERIFY(zone1t < local1); QVERIFY(zone1t <= local1); QVERIFY(!(local1 < zone1t)); QVERIFY(!(local1 <= zone1t)); QCOMPARE(zone1t.secsTo(clock1), 86400); QCOMPARE(zone1t.secsTo(clock2), 185 * 86400); QCOMPARE(clock2.secsTo(zone1t), -(185 * 86400)); QVERIFY(zone1t != clock1); QVERIFY(clock1 != zone1t); QVERIFY(zone1t < clock1); QVERIFY(zone1t <= clock1); QVERIFY(!(clock1 < zone1t)); QVERIFY(!(clock1 <= zone1t)); QCOMPARE(local1t.secsTo(clock1), 0); QCOMPARE(local1t.secsTo(clock2), 184 * 86400); QCOMPARE(clock2.secsTo(local1t), -(184 * 86400)); QVERIFY(local1t != clock1); QVERIFY(local1t != clock1); QVERIFY(!(local1t < clock1)); QVERIFY(local1t <= clock1); QVERIFY(!(local1t < clock1)); QVERIFY(local1t <= clock1); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } /////////////////////////////////////////// // Tests around daylight saving time shifts /////////////////////////////////////////// void KDateTimeTest::dstShifts() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Shift from DST to standard time for the UK in 2005 was at 2005-10-30 01:00 UTC. QDateTime qdt(QDate(2005,10,29), QTime(23,59,59), Qt::UTC); KDateTime dt(qdt, london); QVERIFY(!dt.isSecondOccurrence()); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,10,30), QTime(0,59,59), Qt::LocalTime)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(0,0,0), Qt::UTC), london); QVERIFY(!dt.isSecondOccurrence()); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,10,30), QTime(1,0,0), Qt::LocalTime)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(0,59,59), Qt::UTC), london); QVERIFY(!dt.isSecondOccurrence()); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,10,30), QTime(1,59,59), Qt::LocalTime)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(1,0,0), Qt::UTC), london); QVERIFY(dt.isSecondOccurrence()); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,10,30), QTime(1,0,0), Qt::LocalTime)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(1,59,59), Qt::UTC), london); QVERIFY(dt.isSecondOccurrence()); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,10,30), QTime(1,59,59), Qt::LocalTime)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(2,0,0), Qt::UTC), london); QVERIFY(!dt.isSecondOccurrence()); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,10,30), QTime(2,0,0), Qt::LocalTime)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(0,59,59), Qt::LocalTime), london); dt.setSecondOccurrence(true); // this has no effect QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(2005,10,29), QTime(23,59,59), Qt::UTC)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(1,0,0), Qt::LocalTime), london); QVERIFY(!dt.isSecondOccurrence()); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(2005,10,30), QTime(0,0,0), Qt::UTC)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(1,59,59), Qt::LocalTime), london); QVERIFY(!dt.isSecondOccurrence()); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(2005,10,30), QTime(0,59,59), Qt::UTC)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(1,0,0), Qt::LocalTime), london); dt.setSecondOccurrence(true); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(2005,10,30), QTime(1,0,0), Qt::UTC)); QVERIFY(dt.isSecondOccurrence()); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(1,59,59), Qt::LocalTime), london); dt.setSecondOccurrence(true); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(2005,10,30), QTime(1,59,59), Qt::UTC)); QVERIFY(dt.isSecondOccurrence()); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(2,0,0), Qt::LocalTime), london); dt.setSecondOccurrence(true); // this has no effect QVERIFY(!dt.isSecondOccurrence()); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(2005,10,30), QTime(2,0,0), Qt::UTC)); dt = KDateTime(QDateTime(QDate(2005,10,30), QTime(0,59,59), Qt::LocalTime), london); KDateTime dt1 = dt.addSecs(1); // local time 01:00:00 QVERIFY(!dt1.isSecondOccurrence()); dt1 = dt.addSecs(3600); // local time 01:59:59 QVERIFY(!dt1.isSecondOccurrence()); dt1 = dt.addSecs(3601); // local time 01:00:00 QVERIFY(dt1.isSecondOccurrence()); dt1 = dt.addSecs(7200); // local time 01:59:59 QVERIFY(dt1.isSecondOccurrence()); dt1 = dt.addSecs(7201); // local time 02:00:00 QVERIFY(!dt1.isSecondOccurrence()); QVERIFY(KDateTime(QDate(2005,10,29), london) == KDateTime(QDate(2005,10,29), KDateTime::Spec::OffsetFromUTC(3600))); QVERIFY(KDateTime(QDate(2005,10,30), london) != KDateTime(QDate(2005,10,30), KDateTime::Spec::OffsetFromUTC(3600))); QVERIFY(KDateTime(QDate(2005,10,30), london) != KDateTime(QDate(2005,10,30), KDateTime::Spec::OffsetFromUTC(0))); QVERIFY(KDateTime(QDate(2005,10,31), london) == KDateTime(QDate(2005,10,31), KDateTime::Spec::OffsetFromUTC(0))); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } //////////////////// // String conversion //////////////////// void KDateTimeTest::strings_iso8601() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); bool decpt = KGlobal::locale()->decimalSymbol() == QLatin1String("."); // whether this locale uses '.' as decimal symbol // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); KDateTime dtlocal(QDate(1999,12,11), QTime(3,45,06,12), KDateTime::LocalZone); QString s = dtlocal.toString(KDateTime::ISODate); if (decpt) QCOMPARE(s, QString("1999-12-11T03:45:06.012-08:00")); else QCOMPARE(s, QString("1999-12-11T03:45:06,012-08:00")); KDateTime dtlocal1 = KDateTime::fromString(s, KDateTime::ISODate); QCOMPARE(dtlocal1.dateTime().toUTC(), dtlocal.dateTime().toUTC()); QCOMPARE(dtlocal1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtlocal1.utcOffset(), -8*3600); QVERIFY(dtlocal1 == dtlocal); dtlocal.setDateOnly(true); s = dtlocal.toString(KDateTime::ISODate); QCOMPARE(s, QString("1999-12-11T00:00:00-08:00")); KDateTime dtzone(QDate(1999,6,11), QTime(3,45,06,12), london); s = dtzone.toString(KDateTime::ISODate); if (decpt) QCOMPARE(s, QString("1999-06-11T03:45:06.012+01:00")); else QCOMPARE(s, QString("1999-06-11T03:45:06,012+01:00")); KDateTime dtzone1 = KDateTime::fromString(s, KDateTime::ISODate); QCOMPARE(dtzone1.dateTime().toUTC(), dtzone.dateTime().toUTC()); QCOMPARE(dtzone1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtzone1.utcOffset(), 3600); QVERIFY(dtzone1 == dtzone); dtzone.setDateOnly(true); s = dtzone.toString(KDateTime::ISODate); QCOMPARE(s, QString("1999-06-11T00:00:00+01:00")); KDateTime dtclock(QDate(1999,12,11), QTime(3,45,06), KDateTime::ClockTime); s = dtclock.toString(KDateTime::ISODate); QCOMPARE(s, QString("1999-12-11T03:45:06")); KDateTime dtclock1 = KDateTime::fromString(s, KDateTime::ISODate); QCOMPARE(dtclock1.dateTime(), dtclock.dateTime()); QCOMPARE(dtclock1.timeType(), KDateTime::ClockTime); QVERIFY(dtclock1 == dtclock); dtclock.setDateOnly(true); s = dtclock.toString(KDateTime::ISODate); QCOMPARE(s, QString("1999-12-11")); dtclock1 = KDateTime::fromString(s, KDateTime::ISODate); QVERIFY(dtclock1.isDateOnly()); QCOMPARE(dtclock1.timeType(), KDateTime::ClockTime); QCOMPARE(dtclock1.date(), QDate(1999,12,11)); KDateTime dtutc(QDate(1999,12,11), QTime(3,45,00), KDateTime::UTC); s = dtutc.toString(KDateTime::ISODate); QCOMPARE(s, QString("1999-12-11T03:45:00Z")); KDateTime dtutc1 = KDateTime::fromString(s, KDateTime::ISODate); QCOMPARE(dtutc1.dateTime(), dtutc.dateTime()); QCOMPARE(dtutc1.timeType(), KDateTime::UTC); QVERIFY(dtutc1 == dtutc); dtutc.setDateOnly(true); s = dtutc.toString(KDateTime::ISODate); QCOMPARE(s, QString("1999-12-11T00:00:00Z")); // Check signed years KDateTime dtneg(QDate(-1999,12,11), QTime(3,45,06), KDateTime::ClockTime); s = dtneg.toString(KDateTime::ISODate); QCOMPARE(s, QString("-1999-12-11T03:45:06")); KDateTime dtneg1 = KDateTime::fromString(s, KDateTime::ISODate); QCOMPARE(dtneg1.dateTime(), dtneg.dateTime()); QCOMPARE(dtneg1.timeType(), KDateTime::ClockTime); QVERIFY(dtneg1 == dtneg); KDateTime dtneg2 = KDateTime::fromString(QString("-19991211T034506"), KDateTime::ISODate); QVERIFY(dtneg2 == dtneg); dtneg.setDateOnly(true); s = dtneg.toString(KDateTime::ISODate); QCOMPARE(s, QString("-1999-12-11")); dtneg1 = KDateTime::fromString(s, KDateTime::ISODate); QVERIFY(dtneg1.isDateOnly()); QCOMPARE(dtneg1.timeType(), KDateTime::ClockTime); QCOMPARE(dtneg1.date(), QDate(-1999,12,11)); dtneg2 = KDateTime::fromString(QString("-19991211"), KDateTime::ISODate); QVERIFY(dtneg2 == dtneg1); s = QString("+1999-12-11T03:45:06"); KDateTime dtpos = KDateTime::fromString(s, KDateTime::ISODate); QCOMPARE(dtpos.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,06))); QCOMPARE(dtpos.timeType(), KDateTime::ClockTime); KDateTime dtpos2 = KDateTime::fromString(QString("+19991211T034506"), KDateTime::ISODate); QVERIFY(dtpos2 == dtpos); dtpos.setDateOnly(true); s = QString("+1999-12-11"); dtpos = KDateTime::fromString(s, KDateTime::ISODate); QVERIFY(dtpos.isDateOnly()); QCOMPARE(dtpos.timeType(), KDateTime::ClockTime); QCOMPARE(dtpos.date(), QDate(1999,12,11)); dtpos2 = KDateTime::fromString(QString("+19991211"), KDateTime::ISODate); QVERIFY(dtpos2 == dtpos); // Check years with >4 digits KDateTime dtbig(QDate(123456,12,11), QTime(3,45,06), KDateTime::ClockTime); s = dtbig.toString(KDateTime::ISODate); QCOMPARE(s, QString("123456-12-11T03:45:06")); KDateTime dtbig1 = KDateTime::fromString(s, KDateTime::ISODate); QCOMPARE(dtbig1.dateTime(), dtbig.dateTime()); QCOMPARE(dtbig1.timeType(), KDateTime::ClockTime); QVERIFY(dtbig1 == dtbig); KDateTime dtbig2 = KDateTime::fromString(QString("1234561211T034506"), KDateTime::ISODate); QVERIFY(dtbig2 == dtbig); dtbig.setDateOnly(true); s = dtbig.toString(KDateTime::ISODate); QCOMPARE(s, QString("123456-12-11")); dtbig1 = KDateTime::fromString(s, KDateTime::ISODate); QVERIFY(dtbig1.isDateOnly()); QCOMPARE(dtbig1.timeType(), KDateTime::ClockTime); QCOMPARE(dtbig1.date(), QDate(123456,12,11)); dtbig2 = KDateTime::fromString(QString("1234561211"), KDateTime::ISODate); QVERIFY(dtbig2 == dtbig1); // Check basic format strings bool negZero = true; KDateTime dt = KDateTime::fromString(QString("20000301T1213"), KDateTime::ISODate, &negZero); QVERIFY(dt.timeType() == KDateTime::ClockTime); QVERIFY(!dt.isDateOnly()); QVERIFY(!negZero); QCOMPARE(dt.dateTime(), QDateTime(QDate(2000,3,1), QTime(12,13,0), Qt::LocalTime)); dt = KDateTime::fromString(QString("20000301"), KDateTime::ISODate, &negZero); QVERIFY(dt.timeType() == KDateTime::ClockTime); QVERIFY(dt.isDateOnly()); QVERIFY(!negZero); QCOMPARE(dt.date(), QDate(2000,3,1)); KDateTime::setFromStringDefault(KDateTime::UTC); dt = KDateTime::fromString(QString("20000301T1213"), KDateTime::ISODate); QVERIFY(dt.timeType() == KDateTime::UTC); QCOMPARE(dt.dateTime(), QDateTime(QDate(2000,3,1), QTime(12,13,0), Qt::UTC)); KDateTime::setFromStringDefault(KDateTime::LocalZone); dt = KDateTime::fromString(QString("20000301T1213"), KDateTime::ISODate); QVERIFY(dt.timeSpec() == KDateTime::Spec::LocalZone()); QCOMPARE(dt.dateTime(), QDateTime(QDate(2000,3,1), QTime(12,13,0), Qt::LocalTime)); KDateTime::setFromStringDefault(london); dt = KDateTime::fromString(QString("20000301T1213"), KDateTime::ISODate); QVERIFY(dt.timeType() == KDateTime::TimeZone); QCOMPARE(dt.dateTime(), QDateTime(QDate(2000,3,1), QTime(12,13,0), Qt::LocalTime)); KDateTime::setFromStringDefault(KDateTime::Spec::OffsetFromUTC(5000)); // = +01:23:20 dt = KDateTime::fromString(QString("20000601T1213"), KDateTime::ISODate); QVERIFY(dt.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 5000); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(2000,6,1), QTime(10,49,40), Qt::UTC)); KDateTime::setFromStringDefault(KDateTime::ClockTime); dt = KDateTime::fromString(QString("6543210301T1213"), KDateTime::ISODate, &negZero); QVERIFY(dt.timeType() == KDateTime::ClockTime); QVERIFY(!dt.isDateOnly()); QVERIFY(!negZero); QCOMPARE(dt.dateTime(), QDateTime(QDate(654321,3,1), QTime(12,13,0), Qt::LocalTime)); dt = KDateTime::fromString(QString("6543210301"), KDateTime::ISODate, &negZero); QVERIFY(dt.isDateOnly()); QVERIFY(!negZero); QCOMPARE(dt.date(), QDate(654321,3,1)); dt = KDateTime::fromString(QString("-47120301T1213"), KDateTime::ISODate, &negZero); QVERIFY(dt.timeType() == KDateTime::ClockTime); QVERIFY(!dt.isDateOnly()); QVERIFY(!negZero); QCOMPARE(dt.dateTime(), QDateTime(QDate(-4712,3,1), QTime(12,13,0), Qt::LocalTime)); dt = KDateTime::fromString(QString("-47120301"), KDateTime::ISODate, &negZero); QVERIFY(dt.isDateOnly()); QVERIFY(!negZero); QCOMPARE(dt.date(), QDate(-4712,3,1)); // Check strings containing day-of-the-year dt = KDateTime::fromString(QString("1999-060T19:20:21.06-11:20"), KDateTime::ISODate); QVERIFY(dt.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), -11*3600 - 20*60); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,3,1), QTime(19,20,21,60), Qt::LocalTime)); dt = KDateTime::fromString(QString("1999-060T19:20:21,06-11:20"), KDateTime::ISODate); QVERIFY(dt.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), -11*3600 - 20*60); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,3,1), QTime(19,20,21,60), Qt::LocalTime)); dt = KDateTime::fromString(QString("1999060T192021.06-1120"), KDateTime::ISODate); QVERIFY(dt.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), -11*3600 - 20*60); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,3,1), QTime(19,20,21,60), Qt::LocalTime)); dt = KDateTime::fromString(QString("1999-060"), KDateTime::ISODate); QVERIFY(dt.timeType() == KDateTime::ClockTime); QVERIFY(dt.isDateOnly()); QCOMPARE(dt.date(), QDate(1999,3,1)); // Check 24:00:00 dt = KDateTime::fromString(QString("1999-06-11T24:00:00+03:00"), KDateTime::ISODate); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,6,12), QTime(0,0,0), Qt::LocalTime)); dt = KDateTime::fromString(QString("1999-06-11T24:00:01+03:00"), KDateTime::ISODate); QVERIFY(!dt.isValid()); // Check leap second dt = KDateTime::fromString(QString("1999-06-11T23:59:60Z"), KDateTime::ISODate); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,6,11), QTime(23,59,59), Qt::UTC)); dt = KDateTime::fromString(QString("1999-06-11T13:59:60Z"), KDateTime::ISODate); QVERIFY(!dt.isValid()); dt = KDateTime::fromString(QString("1999-06-11T13:59:60-10:00"), KDateTime::ISODate); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,6,11), QTime(13,59,59), Qt::LocalTime)); dt = KDateTime::fromString(QString("1999-06-11T23:59:60-10:00"), KDateTime::ISODate); QVERIFY(!dt.isValid()); // Check negZero dt = KDateTime::fromString(QString("1999-060T19:20:21.06-00:00"), KDateTime::ISODate, &negZero); QVERIFY(negZero); dt = KDateTime::fromString(QString("1999-060T19:20:21.06+00:00"), KDateTime::ISODate, &negZero); QVERIFY(!negZero); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::strings_rfc2822() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); bool negZero = true; KDateTime dtlocal(QDate(1999,12,11), QTime(3,45,06), KDateTime::LocalZone); QString s = dtlocal.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Dec 1999 03:45:06 -0800")); KDateTime dtlocal1 = KDateTime::fromString(s, KDateTime::RFCDate, &negZero); QCOMPARE(dtlocal1.dateTime().toUTC(), dtlocal.dateTime().toUTC()); QCOMPARE(dtlocal1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtlocal1.utcOffset(), -8*3600); QVERIFY(dtlocal1 == dtlocal); QVERIFY(!negZero); KDateTime dtlocal2 = KDateTime::fromString(s, KDateTime::RFCDateDay); QVERIFY(!dtlocal2.isValid()); s = dtlocal.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Sat, 11 Dec 1999 03:45:06 -0800")); dtlocal2 = KDateTime::fromString(s, KDateTime::RFCDate); QVERIFY(dtlocal1 == dtlocal2); QCOMPARE(dtlocal1.dateTime(), dtlocal2.dateTime()); dtlocal2 = KDateTime::fromString(s, KDateTime::RFCDateDay); QVERIFY(dtlocal1 == dtlocal2); dtlocal2 = KDateTime::fromString(QString("Saturday, 11-Dec-99 03:45:06 -0800"), KDateTime::RFCDate); QVERIFY(dtlocal1 == dtlocal2); dtlocal2 = KDateTime::fromString(QString("11 Dec 1999 03:45:06 PST"), KDateTime::RFCDate, &negZero); QVERIFY(dtlocal1 == dtlocal2); QVERIFY(!negZero); dtlocal.setDateOnly(true); s = dtlocal.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Dec 1999 00:00 -0800")); s = dtlocal.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Sat, 11 Dec 1999 00:00 -0800")); KDateTime dtzone(QDate(1999,6,11), QTime(3,45,06), london); s = dtzone.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Jun 1999 03:45:06 +0100")); KDateTime dtzone1 = KDateTime::fromString(s, KDateTime::RFCDate); QCOMPARE(dtzone1.dateTime().toUTC(), dtzone.dateTime().toUTC()); QCOMPARE(dtzone1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtzone1.utcOffset(), 3600); QVERIFY(dtzone1 == dtzone); KDateTime dtzone2 = KDateTime::fromString(s, KDateTime::RFCDateDay); QVERIFY(!dtzone2.isValid()); s = dtzone.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Fri, 11 Jun 1999 03:45:06 +0100")); dtzone2 = KDateTime::fromString(s, KDateTime::RFCDate); QVERIFY(dtzone1 == dtzone2); QCOMPARE(dtzone1.dateTime(), dtzone2.dateTime()); dtzone2 = KDateTime::fromString(s, KDateTime::RFCDateDay, &negZero); QVERIFY(dtzone1 == dtzone2); QVERIFY(!negZero); dtzone2 = KDateTime::fromString(QString("Friday, 11-Jun-99 03:45:06 +0100"), KDateTime::RFCDateDay); QVERIFY(dtzone1 == dtzone2); dtzone.setDateOnly(true); s = dtzone.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Jun 1999 00:00 +0100")); s = dtzone.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Fri, 11 Jun 1999 00:00 +0100")); KDateTime dtclock(QDate(1999,12,11), QTime(3,45,06), KDateTime::ClockTime); s = dtclock.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Dec 1999 03:45:06 -0800")); KDateTime dtclock1 = KDateTime::fromString(s, KDateTime::RFCDate, &negZero); QCOMPARE(dtclock1.dateTime(), dtclock.dateTime()); QCOMPARE(dtclock1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtclock1.utcOffset(), -8*3600); QVERIFY(dtclock1 == dtclock); QVERIFY(!negZero); KDateTime dtclock2 = KDateTime::fromString(s, KDateTime::RFCDateDay); QVERIFY(!dtclock2.isValid()); s = dtclock.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Sat, 11 Dec 1999 03:45:06 -0800")); dtclock2 = KDateTime::fromString(s, KDateTime::RFCDate); QVERIFY(dtclock1 == dtclock2); QCOMPARE(dtclock1.dateTime(), dtclock2.dateTime()); dtclock2 = KDateTime::fromString(s, KDateTime::RFCDateDay); QVERIFY(dtclock1 == dtclock2); dtclock2 = KDateTime::fromString(QString("Saturday, 11-Dec-99 03:45:06 -0800"), KDateTime::RFCDateDay); QVERIFY(dtclock1 == dtclock2); dtclock.setDateOnly(true); s = dtclock.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Dec 1999 00:00 -0800")); s = dtclock.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Sat, 11 Dec 1999 00:00 -0800")); KDateTime dtutc(QDate(1999,12,11), QTime(3,45,00), KDateTime::UTC); s = dtutc.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Dec 1999 03:45 +0000")); KDateTime dtutc1 = KDateTime::fromString(s, KDateTime::RFCDate, &negZero); QCOMPARE(dtutc1.dateTime(), dtutc.dateTime()); QCOMPARE(dtutc1.timeType(), KDateTime::UTC); QVERIFY(dtutc1 == dtutc); QVERIFY(!negZero); KDateTime dtutc2 = KDateTime::fromString(s, KDateTime::RFCDateDay); QVERIFY(!dtutc2.isValid()); s = dtutc.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Sat, 11 Dec 1999 03:45 +0000")); dtutc2 = KDateTime::fromString(s, KDateTime::RFCDate); QVERIFY(dtutc1 == dtutc2); QCOMPARE(dtutc1.dateTime(), dtutc2.dateTime()); dtutc2 = KDateTime::fromString(s, KDateTime::RFCDateDay); QVERIFY(dtutc1 == dtutc2); dtutc2 = KDateTime::fromString(QString("Saturday, 11-Dec-99 03:45 +0000"), KDateTime::RFCDate); QVERIFY(dtutc1 == dtutc2); dtutc.setDateOnly(true); s = dtutc.toString(KDateTime::RFCDate); QCOMPARE(s, QString("11 Dec 1999 00:00 +0000")); s = dtutc.toString(KDateTime::RFCDateDay); QCOMPARE(s, QString("Sat, 11 Dec 1999 00:00 +0000")); // Check '-0000' and unknown/invalid time zone names dtutc2 = KDateTime::fromString(QString("11 Dec 1999 03:45 -0000"), KDateTime::RFCDate, &negZero); QVERIFY(dtutc1 == dtutc2); QVERIFY(negZero); dtutc2 = KDateTime::fromString(QString("11 Dec 1999 03:45 B"), KDateTime::RFCDate, &negZero); QVERIFY(dtutc1 == dtutc2); QVERIFY(negZero); dtutc2 = KDateTime::fromString(QString("11 Dec 1999 03:45 BCDE"), KDateTime::RFCDate, &negZero); QVERIFY(dtutc1 == dtutc2); QVERIFY(negZero); // Check named time offsets KDateTime dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 UT"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::UTC); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::UTC)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 GMT"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::UTC); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::UTC)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 EDT"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -4*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 EST"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -5*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 CDT"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -5*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 CST"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -6*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 MDT"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -6*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 MST"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -7*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 PDT"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -7*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); dtzname = KDateTime::fromString(QString("11 Dec 1999 03:45:06 PST"), KDateTime::RFCDate, &negZero); QVERIFY(dtzname.timeType() == KDateTime::OffsetFromUTC); QCOMPARE(dtzname.utcOffset(), -8*3600); QCOMPARE(dtzname.dateTime(), QDateTime(QDate(1999,12,11), QTime(3,45,6), Qt::LocalTime)); QVERIFY(!negZero); // Check leap second KDateTime dt = KDateTime::fromString(QString("11 Dec 1999 23:59:60 -0000"), KDateTime::RFCDate); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,12,11), QTime(23,59,59), Qt::UTC)); dt = KDateTime::fromString(QString("11 Dec 1999 13:59:60 -0000"), KDateTime::RFCDate); QVERIFY(!dt.isValid()); dt = KDateTime::fromString(QString("11 Jun 1999 13:59:60 -1000"), KDateTime::RFCDate); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,6,11), QTime(13,59,59), Qt::LocalTime)); dt = KDateTime::fromString(QString("11 Dec 1999 23:59:60 -1000"), KDateTime::RFCDate); QVERIFY(!dt.isValid()); // Check erroneous strings: dtutc2 = KDateTime::fromString(QString("11 Dec 1999 23:59:60 -00:00"), KDateTime::RFCDate); QVERIFY(!dtutc2.isValid()); // colon in UTC offset dtutc2 = KDateTime::fromString(QString("Sun, 11 Dec 1999 03:45 +0000"), KDateTime::RFCDate); QVERIFY(!dtutc2.isValid()); // wrong weekday dtutc2 = KDateTime::fromString(QString("Satu, 11 Dec 1999 03:45 +0000"), KDateTime::RFCDate); QVERIFY(!dtutc2.isValid()); // bad weekday dtutc2 = KDateTime::fromString(QString("11 Dece 1999 03:45 +0000"), KDateTime::RFCDate); QVERIFY(!dtutc2.isValid()); // bad month dtutc2 = KDateTime::fromString(QString("11-Dec 1999 03:45 +0000"), KDateTime::RFCDate); QVERIFY(!dtutc2.isValid()); // only one hyphen in date // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::strings_rfc3339() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); bool negZero = true; KDateTime dtlocal(QDate(1999,2,9), QTime(3,45,06), KDateTime::LocalZone); QString s = dtlocal.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-02-09T03:45:06-08:00")); KDateTime dtlocal1 = KDateTime::fromString(s, KDateTime::RFC3339Date, &negZero); QCOMPARE(dtlocal1.dateTime().toUTC(), dtlocal.dateTime().toUTC()); QCOMPARE(dtlocal1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtlocal1.utcOffset(), -8*3600); QVERIFY(dtlocal1 == dtlocal); QVERIFY(!negZero); dtlocal.setDateOnly(true); s = dtlocal.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-02-09T00:00:00-08:00")); KDateTime dtzone(QDate(1999,6,9), QTime(3,45,06), london); s = dtzone.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-06-09T03:45:06+01:00")); KDateTime dtzone1 = KDateTime::fromString(s, KDateTime::RFC3339Date); QCOMPARE(dtzone1.dateTime().toUTC(), dtzone.dateTime().toUTC()); QCOMPARE(dtzone1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtzone1.utcOffset(), 3600); QVERIFY(dtzone1 == dtzone); dtzone.setDateOnly(true); s = dtzone.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-06-09T00:00:00+01:00")); KDateTime dtclock(QDate(1999,2,9), QTime(3,5,06), KDateTime::ClockTime); s = dtclock.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-02-09T03:05:06-08:00")); KDateTime dtclock1 = KDateTime::fromString(s, KDateTime::RFC3339Date, &negZero); QCOMPARE(dtclock1.dateTime(), dtclock.dateTime()); QCOMPARE(dtclock1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtclock1.utcOffset(), -8*3600); QVERIFY(dtclock1 == dtclock); QVERIFY(!negZero); KDateTime dtclock2 = KDateTime::fromString(QString("1999-02-09t03:05:06-08:00"), KDateTime::RFC3339Date, &negZero); QVERIFY(dtclock1 == dtclock2); dtclock.setDateOnly(true); s = dtclock.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-02-09T00:00:00-08:00")); KDateTime dtutc(QDate(1999,2,9), QTime(3,45,00), KDateTime::UTC); s = dtutc.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-02-09T03:45:00Z")); KDateTime dtutc1 = KDateTime::fromString(s, KDateTime::RFC3339Date, &negZero); QCOMPARE(dtutc1.dateTime(), dtutc.dateTime()); QCOMPARE(dtutc1.timeType(), KDateTime::UTC); QVERIFY(dtutc1 == dtutc); QVERIFY(!negZero); KDateTime dtutc2 = KDateTime::fromString(QString("1999-02-09t03:45:00z"), KDateTime::RFC3339Date, &negZero); QVERIFY(dtutc1 == dtutc2); dtutc.setDateOnly(true); s = dtutc.toString(KDateTime::RFC3339Date); QCOMPARE(s, QString("1999-02-09T00:00:00Z")); // Check '-00:00' (specifies unknown local offset) dtutc2 = KDateTime::fromString(QString("1999-02-09T03:45:00-00:00"), KDateTime::RFC3339Date, &negZero); QVERIFY(dtutc1 == dtutc2); QVERIFY(negZero); dtutc2 = KDateTime::fromString(QString("1999-02-09T03:45:00+00:00"), KDateTime::RFC3339Date, &negZero); QVERIFY(dtutc1 == dtutc2); QVERIFY(!negZero); // Check leap second KDateTime dt = KDateTime::fromString(QString("1999-02-09T23:59:60z"), KDateTime::RFC3339Date); QCOMPARE(dt.dateTime(), QDateTime(QDate(1999,2,9), QTime(23,59,59), Qt::UTC)); dt = KDateTime::fromString(QString("1999-02-09T23:59:60+00:00"), KDateTime::RFC3339Date); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(1999,2,9), QTime(23,59,59), Qt::UTC)); dt = KDateTime::fromString(QString("1999-02-09T13:59:60-00:00"), KDateTime::RFC3339Date); QVERIFY(!dt.isValid()); dt = KDateTime::fromString(QString("1999-06-11T13:59:60-10:00"), KDateTime::RFC3339Date); QCOMPARE(dt.toUtc().dateTime(), QDateTime(QDate(1999,6,11), QTime(23,59,59), Qt::UTC)); dt = KDateTime::fromString(QString("1999-12-11T23:59:60-10:00"), KDateTime::RFC3339Date); QVERIFY(!dt.isValid()); // Check erroneous strings: dtutc2 = KDateTime::fromString(QString("1999-02-09 03:45:00"), KDateTime::RFC3339Date, &negZero); QVERIFY(!dtutc2.isValid()); dtutc2 = KDateTime::fromString(QString("1999-02-09T03:45:00B"), KDateTime::RFC3339Date, &negZero); QVERIFY(!dtutc2.isValid()); dtutc2 = KDateTime::fromString(QString("1999-02-09T23:59:60-0000"), KDateTime::RFC3339Date); QVERIFY(!dtutc2.isValid()); // no colon in UTC offset dtutc2 = KDateTime::fromString(QString("19990-12-10T03:45:01+00:00"), KDateTime::RFC3339Date); QVERIFY(!dtutc2.isValid()); // bad year dtutc2 = KDateTime::fromString(QString("1999-13-10T03:45:01+00:00"), KDateTime::RFC3339Date); QVERIFY(!dtutc2.isValid()); // bad month dtutc2 = KDateTime::fromString(QString("1999-10-32T03:45:01+00:00"), KDateTime::RFC3339Date); QVERIFY(!dtutc2.isValid()); // bad day dtutc2 = KDateTime::fromString(QString("1999-1209T03:45:00+00:00"), KDateTime::RFC3339Date); QVERIFY(!dtutc2.isValid()); // only one hyphen in date dtutc2 = KDateTime::fromString(QString("1999-12T03:45:00+00:00"), KDateTime::RFC3339Date); QVERIFY(!dtutc2.isValid()); // no day of month // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::strings_qttextdate() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); bool negZero = true; KDateTime dtlocal(QDate(1999,12,11), QTime(3,45,06), KDateTime::LocalZone); QString s = dtlocal.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Sat Dec 11 03:45:06 1999 -0800")); KDateTime dtlocal1 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QCOMPARE(dtlocal1.dateTime().toUTC(), dtlocal.dateTime().toUTC()); QCOMPARE(dtlocal1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtlocal1.utcOffset(), -8*3600); QVERIFY(dtlocal1 == dtlocal); QVERIFY(!dtlocal1.isDateOnly()); QVERIFY(!negZero); dtlocal.setDateOnly(true); s = dtlocal.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Sat Dec 11 1999 -0800")); dtlocal1 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QVERIFY(dtlocal1.isDateOnly()); QCOMPARE(dtlocal1.date(), QDate(1999,12,11)); QCOMPARE(dtlocal1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtlocal1.utcOffset(), -8*3600); KDateTime dtzone(QDate(1999,6,11), QTime(3,45,06), london); s = dtzone.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Fri Jun 11 03:45:06 1999 +0100")); KDateTime dtzone1 = KDateTime::fromString(s, KDateTime::QtTextDate); QCOMPARE(dtzone1.dateTime().toUTC(), dtzone.dateTime().toUTC()); QCOMPARE(dtzone1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtzone1.utcOffset(), 3600); QVERIFY(!dtzone1.isDateOnly()); QVERIFY(dtzone1 == dtzone); KDateTime dtzone2 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QVERIFY(dtzone1 == dtzone2); QVERIFY(!negZero); dtzone.setDateOnly(true); s = dtzone.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Fri Jun 11 1999 +0100")); dtzone1 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QVERIFY(dtzone1.isDateOnly()); QCOMPARE(dtzone1.date(), QDate(1999,6,11)); QCOMPARE(dtzone1.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dtzone1.utcOffset(), 3600); KDateTime dtclock(QDate(1999,12,11), QTime(3,45,06), KDateTime::ClockTime); s = dtclock.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Sat Dec 11 03:45:06 1999")); KDateTime dtclock1 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QCOMPARE(dtclock1.dateTime(), dtclock.dateTime()); QCOMPARE(dtclock1.timeType(), KDateTime::ClockTime); QVERIFY(dtclock1 == dtclock); QVERIFY(!dtclock1.isDateOnly()); QVERIFY(!negZero); dtclock.setDateOnly(true); s = dtclock.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Sat Dec 11 1999")); dtclock1 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QVERIFY(dtclock1.isDateOnly()); QCOMPARE(dtclock1.date(), QDate(1999,12,11)); QCOMPARE(dtclock1.timeType(), KDateTime::ClockTime); KDateTime dtutc(QDate(1999,12,11), QTime(3,45,00), KDateTime::UTC); s = dtutc.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Sat Dec 11 03:45:00 1999 +0000")); KDateTime dtutc1 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QCOMPARE(dtutc1.dateTime(), dtutc.dateTime()); QCOMPARE(dtutc1.timeType(), KDateTime::UTC); QVERIFY(dtutc1 == dtutc); QVERIFY(!dtutc1.isDateOnly()); QVERIFY(!negZero); dtutc.setDateOnly(true); s = dtutc.toString(KDateTime::QtTextDate); QCOMPARE(s, QString("Sat Dec 11 1999 +0000")); dtutc1 = KDateTime::fromString(s, KDateTime::QtTextDate, &negZero); QVERIFY(dtutc1.isDateOnly()); QCOMPARE(dtutc1.date(), QDate(1999,12,11)); QCOMPARE(dtutc1.timeType(), KDateTime::UTC); // Check '-0000' KDateTime dtutc2 = KDateTime::fromString(QString("Sat Dec 11 03:45:00 1999 -0000"), KDateTime::QtTextDate, &negZero); QVERIFY(dtutc1 != dtutc2); QVERIFY(negZero); // Check erroneous strings dtutc2 = KDateTime::fromString(QString("Sat Dec 11 03:45:00 1999 GMT"), KDateTime::QtTextDate, &negZero); QVERIFY(!dtutc2.isValid()); dtutc2 = KDateTime::fromString(QString("Sun Dec 11 03:45:00 1999 +0000"), KDateTime::QtTextDate); QVERIFY(dtutc2.isValid()); // wrong weekday: accepted by Qt!! dtutc2 = KDateTime::fromString(QString("Satu, Dec 11 03:45:00 1999 +0000"), KDateTime::QtTextDate); QVERIFY(dtutc2.isValid()); // bad weekday, accepted by Qt (since 4.3) dtutc2 = KDateTime::fromString(QString("Sat Dece 11 03:45:00 1999 +0000"), KDateTime::QtTextDate); QVERIFY(!dtutc2.isValid()); // bad month, not accepted by Qt anymore (since 4.3) // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::strings_format() { KCalendarSystem* calendar = KCalendarSystem::create(KLocale::GregorianCalendar, KGlobal::locale()); KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone paris = KSystemTimeZones::zone("Europe/Paris"); KTimeZone berlin = KSystemTimeZones::zone("Europe/Berlin"); KTimeZone cairo = KSystemTimeZones::zone("Africa/Cairo"); KTimeZones zones; zones.add(london); zones.add(paris); zones.add(berlin); zones.add(cairo); // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // toString() QString all = QLatin1String("%Y.%y.%m.%:m.%B.%b.%d.%e.%A.%a-%H.%k.%I.%l.%M.%S?%:s?%P.%p.%:u.%z.%Z.%:Z.%:A.%:a.%:B.%:b/%:S.%:z.%%."); KDateTime dt(QDate(1999,2,3), QTime(6,5,0), KDateTime::LocalZone); QString s = dt.toString(all); QCOMPARE(s, QString::fromLatin1("1999.99.02.2.%1.%2.03.3.%3.%4-06.6.06.6.05.00?000?am.AM.-08.-0800.PST.America/Los_Angeles.Wednesday.Wed.February.Feb/.-08:00.%.") .arg(calendar->monthName(2,1999,KCalendarSystem::LongName)) .arg(calendar->monthName(2,1999,KCalendarSystem::ShortName)) .arg(calendar->weekDayName(3,KCalendarSystem::LongDayName)) .arg(calendar->weekDayName(3,KCalendarSystem::ShortDayName))); KDateTime dtzone(QDate(1970,4,30), QTime(12,45,16,25), london); s = dtzone.toString(all); QCOMPARE(s, QString::fromLatin1("1970.70.04.4.%1.%2.30.30.%3.%4-12.12.12.12.45.16?025?pm.PM.+01.+0100.BST.Europe/London.Thursday.Thu.April.Apr/:16.+01:00.%.") .arg(calendar->monthName(4,2000,KCalendarSystem::LongName)) .arg(calendar->monthName(4,2000,KCalendarSystem::ShortName)) .arg(calendar->weekDayName(4,KCalendarSystem::LongDayName)) .arg(calendar->weekDayName(4,KCalendarSystem::ShortDayName))); KDateTime dtclock(QDate(2005,9,5), QTime(0,0,06,1), KDateTime::ClockTime); s = dtclock.toString(all); QCOMPARE(s, QString::fromLatin1("2005.05.09.9.%1.%2.05.5.%3.%4-00.0.12.12.00.06?001?am.AM.....Monday.Mon.September.Sep/:06..%.") .arg(calendar->monthName(9,2000,KCalendarSystem::LongName)) .arg(calendar->monthName(9,2000,KCalendarSystem::ShortName)) .arg(calendar->weekDayName(1,KCalendarSystem::LongDayName)) .arg(calendar->weekDayName(1,KCalendarSystem::ShortDayName))); KDateTime dtutc(QDate(2000,12,31), QTime(13,45,16,100), KDateTime::UTC); s = dtutc.toString(all); QCOMPARE(s, QString::fromLatin1("2000.00.12.12.%1.%2.31.31.%3.%4-13.13.01.1.45.16?100?pm.PM.+00.+0000.UTC.UTC.Sunday.Sun.December.Dec/:16.+00:00.%.") .arg(calendar->monthName(12,2000,KCalendarSystem::LongName)) .arg(calendar->monthName(12,2000,KCalendarSystem::ShortName)) .arg(calendar->weekDayName(7,KCalendarSystem::LongDayName)) .arg(calendar->weekDayName(7,KCalendarSystem::ShortDayName))); // fromString() without KTimeZones parameter dt = KDateTime::fromString(QLatin1String("2005/9/05/20:2,03"), QLatin1String("%Y/%:m/%d/%S:%k,%M")); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(2,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::ClockTime); dt = KDateTime::fromString(QString::fromLatin1("%1pm05ab%2t/052/20:2,03+10") .arg(calendar->weekDayName(1,KCalendarSystem::LongDayName)) .arg(calendar->monthName(9,1999,KCalendarSystem::LongName)), QLatin1String("%a%p%yab%Bt/%e2/%S:%l,%M %z")); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 10*3600); dt = KDateTime::fromString(QString::fromLatin1("%1pm05ab%2t/052/20:2,03+10") .arg(calendar->weekDayName(1,KCalendarSystem::ShortDayName)) .arg(calendar->monthName(9,1999,KCalendarSystem::ShortName)), QLatin1String("%a%p%yab%Bt/%d2/%s:%l,%:M %z")); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 10*3600); dt = KDateTime::fromString(QString::fromLatin1("monpm05absEpt/052/20:2,03+10"), QLatin1String("%a%p%yab%Bt/%d2/%S:%l,%M %z")); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 10*3600); dt = KDateTime::fromString(QString::fromLatin1("monDAYpm05absEptemBert/052/20:2,03+10"), QLatin1String("%a%p%yab%Bt/%e2/%S:%l,%M %z")); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 10*3600); dt = KDateTime::fromString(QString::fromLatin1("monDAYpm05abmzatemer/052/20:2,03+10"), QLatin1String("%a%p%yab%B/%e2/%S:%l,%M %z")); QVERIFY(!dt.isValid()); // invalid month name dt = KDateTime::fromString(QString::fromLatin1("monDApm05absep/052/20:2,03+10"), QLatin1String("%a%p%yab%B/%e2/%S:%l,%M %z")); QVERIFY(!dt.isValid()); // invalid day name dt = KDateTime::fromString(QLatin1String("mONdAYPM2005absEpt/052/20:02,03+1000"), QLatin1String("%:A%:p%Yab%Bt/%d2/%S:%I,%M %:u")); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,3,20), Qt::LocalTime)); QCOMPARE(dt.utcOffset(), 10*3600); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); dtclock = KDateTime::fromString(QLatin1String("mONdAYPM2005abSept/052/20:02,03+100"), QLatin1String("%:A%:p%Yab%Bt/%e2/%S:%l,%M %:u")); QVERIFY(!dtclock.isValid()); // wrong number of digits in UTC offset dtclock = KDateTime::fromString(QLatin1String("mONdAYPM2005abSept/052/20:02,03+1"), QLatin1String("%:A%:p%Yab%Bt/%d2/%S:%I,%M %z")); QVERIFY(!dtclock.isValid()); // wrong number of digits in UTC offset dtclock = KDateTime::fromString(QLatin1String("mONdAYPM2005absEpt/052/20:13,03+1000"), QLatin1String("%:A%:p%Yab%Bt/%d2/%S:%I,%M %:u")); QVERIFY(!dtclock.isValid()); // hours out of range for am/pm dtclock = KDateTime::fromString(QLatin1String("mONdAYPM2005absEpt/052/20:00,03+1000"), QLatin1String("%:A%:p%Yab%Bt/%d2/%S:%I,%M %:u")); QVERIFY(!dtclock.isValid()); // hours out of range for am/pm // fromString() with KTimeZones parameter dt = KDateTime::fromString(QLatin1String("mon 2005/9/05/20:2,03"), QLatin1String("%:a %Y/%:m/%e/%S:%k,%M"), &zones); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(2,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::ClockTime); dt = KDateTime::fromString(QLatin1String("tue 2005/9/05/20:2,03"), QLatin1String("%:a %Y/%:m/%d/%S:%k,%M"), &zones); QVERIFY(!dt.isValid()); // wrong day-of-week dt = KDateTime::fromString(QLatin1String("pm2005absEpt/05monday/20:2,03+03:00"), QLatin1String("%p%Yab%Bt/%e%:A/%S:%l,%M %:z"), &zones); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::TimeZone); QCOMPARE(dt.utcOffset(), 3*3600); QCOMPARE(dt.timeZone(), cairo); dt = KDateTime::fromString(QLatin1String("pm2005absEpt/05sunday/20:2,03+03:00"), QLatin1String("%p%Yab%Bt/%d%A/%S:%l,%M %:z"), &zones); QVERIFY(!dt.isValid()); // wrong day-of-week dtutc = KDateTime::fromString(QLatin1String("2000-01-01T00:00:00.000+0000"), QLatin1String("%Y-%m-%dT%H:%M%:S%:s%z")); QVERIFY(dtutc.isValid()); dt = KDateTime::fromString(QLatin1String("2000-01-01T05:00:00.000+0500"), QLatin1String("%Y-%m-%dT%H:%M%:S%:s%z")); QVERIFY(dt.isValid()); QVERIFY(dtutc == dt); dt = KDateTime::fromString(QLatin1String("1999-12-31T20:30:00.000-0330"), QLatin1String("%Y-%m-%dT%H:%M%:S%:s%z")); QVERIFY(dt.isValid()); QVERIFY(dtutc == dt); dt = KDateTime::fromString(QLatin1String("200509051430:01.3+0100"), QLatin1String("%Y%m%d%H%M%:S%:s%z"), &zones, true); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,30,01,300), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::TimeZone); QCOMPARE(dt.timeZone(), london); QCOMPARE(dt.utcOffset(), 3600); dt = KDateTime::fromString(QLatin1String("200509051430:01.3+0500"), QLatin1String("%Y%m%d%H%M%:S%:s%z"), &zones, false); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,30,01,300), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 5*3600); dt = KDateTime::fromString(QLatin1String("200509051430:01.3+0200"), QLatin1String("%Y%m%d%H%M%:S%:s%z"), &zones, true); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,30,01,300), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 2*3600); dt = KDateTime::fromString(QLatin1String("200509051430:01.3+0200"), QLatin1String("%Y%m%d%H%M%:S%:s%z"), &zones, false); QVERIFY(!dt.isValid()); // matches paris and berlin dt = KDateTime::fromString(QLatin1String("2005September051430 CEST"), QLatin1String("%Y%:B%d%H%M%:S %Z"), &zones, true); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(14,30,0), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::OffsetFromUTC); QCOMPARE(dt.utcOffset(), 2*3600); dt = KDateTime::fromString(QLatin1String("2005September051430 CEST"), QLatin1String("%Y%:B%d%H%M%:S %Z"), &zones, false); QVERIFY(!dt.isValid()); // matches paris and berlin dt = KDateTime::fromString(QLatin1String("pm05absEptembeRt/ 052/ 20:12,03+0100"), QLatin1String("%:P%yab%:bt/ %e2/%t%S:%l,%M %z"), &zones); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,5), QTime(12,3,20), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::TimeZone); QCOMPARE(dt.utcOffset(), 3600); QCOMPARE(dt.timeZone(), london); dt = KDateTime::fromString(QLatin1String("2005absEpt/042sun/20.0123456:12Am,3Africa/Cairo%"), QLatin1String("%Yab%bt/%e2%a/%S%:s:%I%P,%:M %:Z%%"), &zones); QCOMPARE(dt.dateTime(), QDateTime(QDate(2005,9,4), QTime(0,3,20,12), Qt::LocalTime)); QCOMPARE(dt.timeType(), KDateTime::TimeZone); QCOMPARE(dt.timeZone(), cairo); QCOMPARE(dt.utcOffset(), 3*3600); // Test large and minimum date values dt = KDateTime(QDate(-2005,9,5), QTime(0,0,06,1), KDateTime::ClockTime); s = dt.toString(QLatin1String("%Y")); QCOMPARE(s, QString::fromLatin1("-2005")); dt = KDateTime(QDate(-15,9,5), QTime(0,0,06,1), KDateTime::ClockTime); s = dt.toString(QLatin1String("%Y")); QCOMPARE(s, QString::fromLatin1("-0015")); dt = KDateTime::fromString(QLatin1String("-471209051430:01.3+0500"), QLatin1String("%Y%m%d%H%M%:S%:s%z")); QCOMPARE(dt.dateTime(), QDateTime(QDate(-4712,9,5), QTime(14,30,1,300), Qt::LocalTime)); QCOMPARE(dt.utcOffset(), 5*3600); QVERIFY(dt.isValid()); QVERIFY(!dt.outOfRange()); dt = KDateTime::fromString(QLatin1String("999909051430:01.3+0500"), QLatin1String("%Y%m%d%H%M%:S%:s%z")); QCOMPARE(dt.dateTime(), QDateTime(QDate(9999,9,5), QTime(14,30,1,300), Qt::LocalTime)); QCOMPARE(dt.utcOffset(), 5*3600); QVERIFY(dt.isValid()); QVERIFY(!dt.outOfRange()); dt = KDateTime::fromString(QLatin1String("123456.09051430:01.3+0500"), QLatin1String("%:Y.%m%d%H%M%:S%:s%z")); QCOMPARE(dt.dateTime(), QDateTime(QDate(123456,9,5), QTime(14,30,1,300), Qt::LocalTime)); QCOMPARE(dt.utcOffset(), 5*3600); QVERIFY(dt.isValid()); QVERIFY(!dt.outOfRange()); s = dt.toString(QLatin1String("%Y")); QCOMPARE(s, QString::fromLatin1("123456")); dt = KDateTime::fromString(QLatin1String("-471412311430:01.3+0500"), QLatin1String("%Y%m%d%H%M%:S%:s%z")); QVERIFY(!dt.isValid()); // too early QVERIFY(dt.outOfRange()); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } // This test requires ENABLE_TESTING to be defined in kdecore/date/kdatetime.cpp void KDateTimeTest::cache() { KTimeZone london = KSystemTimeZones::zone("Europe/London"); KTimeZone losAngeles = KSystemTimeZones::zone("America/Los_Angeles"); KTimeZone cairo = KSystemTimeZones::zone("Africa/Cairo"); const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":Europe/London", 1); ::tzset(); // Ensure that local time is different from UTC and different from 'london' ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); int utcHit = KDateTime_utcCacheHit; int zoneHit = KDateTime_zoneCacheHit; KDateTime local(QDate(2005,6,1), QTime(12,0,0), KDateTime::LocalZone); QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt1 = local.toZone(london); QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime cai = local.toZone(cairo); ++utcHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt2a = local.toZone(london); ++utcHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt2 = local.toZone(london); ++zoneHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt3 = dt2; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt4 = dt2.toZone(losAngeles); ++zoneHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt4a = dt3.toZone(losAngeles); ++zoneHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt5 = dt2.toZone(losAngeles); ++zoneHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt5a = dt3.toZone(losAngeles); ++zoneHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt6 = dt2.toZone(cairo); ++utcHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt6a = dt3.toZone(cairo); ++zoneHit; QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); dt3.detach(); KDateTime dt7 = dt2.toZone(london); QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); KDateTime dt7a = dt3.toZone(london); QCOMPARE(KDateTime_utcCacheHit, utcHit); QCOMPARE(KDateTime_zoneCacheHit, zoneHit); // Check that cached time zone conversions are cleared correctly KDateTime utc1(QDate(2005,7,6), QTime(3,40,0), KDateTime::UTC); KDateTime la1 = utc1.toTimeSpec(losAngeles); KDateTime utc2 = utc1.addDays(1); KDateTime la2 = utc2.toTimeSpec(losAngeles); QVERIFY(la1 != la2); QCOMPARE(la1.secsTo(la2), 86400); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::stream() { // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); // Ensure that the original contents of the KDateTime receiving a streamed value // don't affect the new contents. QByteArray data; QDataStream ds(&data, QIODevice::ReadWrite); KDateTime testdt, result; data.clear(); testdt = KDateTime(QDate(2005,6,1), QTime(12,0,0), KDateTime::LocalZone); result = KDateTime::currentUtcDateTime(); ds << testdt; ds.device()->seek(0); ds >> result; QCOMPARE(result, testdt); data.clear(); testdt = KDateTime(QDate(2005,6,1), QTime(12,0,0), KDateTime::LocalZone); result = KDateTime::currentLocalDateTime(); ds.device()->seek(0); ds << testdt; ds.device()->seek(0); ds >> result; QCOMPARE(result, testdt); data.clear(); testdt = KDateTime(QDate(2006,8,30), QTime(7,0,0), KDateTime::UTC); result = KDateTime::currentUtcDateTime(); ds.device()->seek(0); ds << testdt; ds.device()->seek(0); ds >> result; QCOMPARE(result, testdt); data.clear(); testdt = KDateTime(QDate(2006,8,30), QTime(7,0,0), KDateTime::UTC); result = KDateTime::currentLocalDateTime(); ds.device()->seek(0); ds << testdt; ds.device()->seek(0); ds >> result; QCOMPARE(result, testdt); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } void KDateTimeTest::misc() { // Ensure that local time is different from UTC and different from 'london' const char *originalZone = ::getenv("TZ"); // save the original local time zone ::setenv("TZ", ":America/Los_Angeles", 1); ::tzset(); KDateTime local = KDateTime::currentLocalDateTime(); KDateTime utc = KDateTime::currentUtcDateTime(); QDateTime qcurrent = QDateTime::currentDateTime(); // Because 3 calls to fetch the current time were made, they will differ slightly KDateTime localUtc = local.toUtc(); int diff = localUtc.secsTo(utc); if (diff > 1 || diff < 0) QCOMPARE(local.toUtc().dateTime(), utc.dateTime()); diff = local.dateTime().secsTo(qcurrent); if (diff > 1 || diff < 0) QCOMPARE(local.dateTime(), qcurrent); // Restore the original local time zone if (!originalZone) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); }