diff options
| author | Edward Welbourne <edward.welbourne@qt.io> | 2022-08-30 16:08:07 +0200 |
|---|---|---|
| committer | Edward Welbourne <edward.welbourne@qt.io> | 2022-12-09 16:16:48 +0100 |
| commit | 3f282e8896980822b86bc009f85bf047c7d9c189 (patch) | |
| tree | 60e5632b1bb5a02fbe94e69eb5e53250904fe6d3 /src | |
| parent | e71099989ebde3156c23066ff2d79ae63c08ccc4 (diff) | |
Adapt corelib to use QTimeZone in place of Qt::TimeSpec
This saves (mostly in corelib/time/) some complications that used to
arise from needing different code-paths for different time-specs.
Task-number: QTBUG-108199
Change-Id: I5dbd09859fce7599f1ba761f8a0bfc4633d0bef9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/io/qdir.cpp | 4 | ||||
| -rw-r--r-- | src/corelib/io/qfilesystemengine_win.cpp | 2 | ||||
| -rw-r--r-- | src/corelib/io/qfilesystemmetadata_p.h | 25 | ||||
| -rw-r--r-- | src/corelib/serialization/qcborvalue.cpp | 4 | ||||
| -rw-r--r-- | src/corelib/time/qdatetimeparser.cpp | 101 | ||||
| -rw-r--r-- | src/corelib/time/qtimezone.cpp | 6 | ||||
| -rw-r--r-- | src/corelib/time/qtimezoneprivate.cpp | 2 | ||||
| -rw-r--r-- | src/corelib/time/qtimezoneprivate_tz.cpp | 18 |
8 files changed, 69 insertions, 93 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index b54ae214b02..f2ed537d982 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -226,8 +226,8 @@ bool QDirSortItemComparator::operator()(const QDirSortItem &n1, const QDirSortIt // find timezones, which is incredibly expensive. As we aren't // presenting these to the user, we don't care (at all) about the // local timezone, so force them to UTC to avoid that conversion. - firstModified.setTimeSpec(Qt::UTC); - secondModified.setTimeSpec(Qt::UTC); + firstModified.setTimeZone(QTimeZone::UTC); + secondModified.setTimeZone(QTimeZone::UTC); r = firstModified.msecsTo(secondModified); break; diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp index f80a6805e90..6d085d98c99 100644 --- a/src/corelib/io/qfilesystemengine_win.cpp +++ b/src/corelib/io/qfilesystemengine_win.cpp @@ -1822,7 +1822,7 @@ static inline QDateTime fileTimeToQDateTime(const FILETIME *time) FileTimeToSystemTime(time, &sTime); return QDateTime(QDate(sTime.wYear, sTime.wMonth, sTime.wDay), QTime(sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds), - Qt::UTC); + QTimeZone::UTC); } QDateTime QFileSystemMetaData::birthTime() const diff --git a/src/corelib/io/qfilesystemmetadata_p.h b/src/corelib/io/qfilesystemmetadata_p.h index 986ec5ca689..cb19b98c335 100644 --- a/src/corelib/io/qfilesystemmetadata_p.h +++ b/src/corelib/io/qfilesystemmetadata_p.h @@ -18,6 +18,7 @@ #include "qplatformdefs.h" #include <QtCore/qglobal.h> #include <QtCore/qdatetime.h> +#include <QtCore/qtimezone.h> #include <QtCore/private/qabstractfileengine_p.h> // Platform-specific includes @@ -264,13 +265,29 @@ inline QDateTime QFileSystemMetaData::fileTime(QAbstractFileEngine::FileTime tim #if defined(Q_OS_UNIX) inline QDateTime QFileSystemMetaData::birthTime() const -{ return birthTime_ ? QDateTime::fromMSecsSinceEpoch(birthTime_, Qt::UTC) : QDateTime(); } +{ + return birthTime_ + ? QDateTime::fromMSecsSinceEpoch(birthTime_, QTimeZone::UTC) + : QDateTime(); +} inline QDateTime QFileSystemMetaData::metadataChangeTime() const -{ return metadataChangeTime_ ? QDateTime::fromMSecsSinceEpoch(metadataChangeTime_, Qt::UTC) : QDateTime(); } +{ + return metadataChangeTime_ + ? QDateTime::fromMSecsSinceEpoch(metadataChangeTime_, QTimeZone::UTC) + : QDateTime(); +} inline QDateTime QFileSystemMetaData::modificationTime() const -{ return modificationTime_ ? QDateTime::fromMSecsSinceEpoch(modificationTime_, Qt::UTC) : QDateTime(); } +{ + return modificationTime_ + ? QDateTime::fromMSecsSinceEpoch(modificationTime_, QTimeZone::UTC) + : QDateTime(); +} inline QDateTime QFileSystemMetaData::accessTime() const -{ return accessTime_ ? QDateTime::fromMSecsSinceEpoch(accessTime_, Qt::UTC) : QDateTime(); } +{ + return accessTime_ + ? QDateTime::fromMSecsSinceEpoch(accessTime_, QTimeZone::UTC) + : QDateTime(); +} inline uint QFileSystemMetaData::userId() const { return userId_; } inline uint QFileSystemMetaData::groupId() const { return groupId_; } diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp index e9b351166f9..604de7891b0 100644 --- a/src/corelib/serialization/qcborvalue.cpp +++ b/src/corelib/serialization/qcborvalue.cpp @@ -17,6 +17,8 @@ #include <qendian.h> #include <qlocale.h> +#include <qdatetime.h> +#include <qtimezone.h> #include <private/qbytearray_p.h> #include <private/qnumeric_p.h> #include <private/qsimd_p.h> @@ -798,7 +800,7 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d) ok = convertDoubleTo(round(e.fpvalue() * 1000), &msecs); } if (ok) - dt = QDateTime::fromMSecsSinceEpoch(msecs, Qt::UTC); + dt = QDateTime::fromMSecsSinceEpoch(msecs, QTimeZone::UTC); } if (dt.isValid()) { QByteArray text = dt.toString(Qt::ISODateWithMs).toLatin1(); diff --git a/src/corelib/time/qdatetimeparser.cpp b/src/corelib/time/qdatetimeparser.cpp index 8daf926c45a..5eb8376d29c 100644 --- a/src/corelib/time/qdatetimeparser.cpp +++ b/src/corelib/time/qdatetimeparser.cpp @@ -6,14 +6,12 @@ #include "private/qstringiterator_p.h" #include "qdatastream.h" -#include "qset.h" -#include "qvarlengtharray.h" -#include "qlocale.h" #include "qdatetime.h" -#if QT_CONFIG(timezone) -#include "qtimezone.h" -#endif #include "qdebug.h" +#include "qlocale.h" +#include "qset.h" +#include "qtimezone.h" +#include "qvarlengtharray.h" //#define QDATETIMEPARSER_DEBUG #if defined (QDATETIMEPARSER_DEBUG) && !defined(QT_NO_DEBUG_STREAM) @@ -134,9 +132,7 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const int minute = time.minute(); int second = time.second(); int msec = time.msec(); - Qt::TimeSpec tspec = v.timeSpec(); - // Only offset from UTC is amenable to setting an int value: - int offset = tspec == Qt::OffsetFromUTC ? v.offsetFromUtc() : 0; + QTimeZone timeZone = v.timeRepresentation(); const SectionNode &node = sectionNodes.at(index); switch (node.type) { @@ -168,8 +164,8 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const case TimeZoneSection: if (newVal < absoluteMin(index) || newVal > absoluteMax(index)) return false; - tspec = Qt::OffsetFromUTC; - offset = newVal; + // Only offset from UTC is amenable to setting an int value: + timeZone = QTimeZone::fromSecondsAheadOfUtc(newVal); break; case AmPmSection: hour = (newVal == 0 ? hour % 12 : (hour % 12) + 12); break; default: @@ -209,12 +205,7 @@ bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const if (!newDate.isValid() || !newTime.isValid()) return false; - // Preserve zone: - v = -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone ? QDateTime(newDate, newTime, v.timeZone()) : -#endif - QDateTime(newDate, newTime, tspec, offset); + v = QDateTime(newDate, newTime, timeZone); return true; } @@ -231,11 +222,7 @@ int QDateTimeParser::absoluteMax(int s, const QDateTime &cur) const const SectionNode &sn = sectionNode(s); switch (sn.type) { case TimeZoneSection: -#if QT_CONFIG(timezone) return QTimeZone::MaxUtcOffsetSecs; -#else - return +14 * 3600; // NB: copied from QTimeZone -#endif case Hour24Section: case Hour12Section: // This is special-cased in parseSection. @@ -279,11 +266,7 @@ int QDateTimeParser::absoluteMin(int s) const const SectionNode &sn = sectionNode(s); switch (sn.type) { case TimeZoneSection: -#if QT_CONFIG(timezone) return QTimeZone::MinUtcOffsetSecs; -#else - return -14 * 3600; // NB: copied from QTimeZone -#endif case Hour24Section: case Hour12Section: case MinuteSection: @@ -1179,26 +1162,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const int second = defaultTime.second(); int msec = defaultTime.msec(); int dayofweek = calendar.dayOfWeek(defaultDate); - Qt::TimeSpec tspec = defaultValue.timeSpec(); - int zoneOffset = 0; // In seconds; local - UTC -#if QT_CONFIG(timezone) - QTimeZone timeZone; -#endif - switch (tspec) { - case Qt::OffsetFromUTC: // timeZone is ignored - zoneOffset = defaultValue.offsetFromUtc(); - break; -#if QT_CONFIG(timezone) - case Qt::TimeZone: - timeZone = defaultValue.timeZone(); - if (timeZone.isValid()) - zoneOffset = timeZone.offsetFromUtc(defaultValue); - // else: is there anything we can do about this ? - break; -#endif - default: // zoneOffset and timeZone are ignored - break; - } + QTimeZone timeZone = defaultValue.timeRepresentation(); int ampm = -1; Sections isSet = NoSection; @@ -1215,6 +1179,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const pos += separator.size(); sectionNodes[index].pos = pos; int *current = nullptr; + int zoneOffset; // Needed to serve as *current when setting zone const SectionNode sn = sectionNodes.at(index); ParsedSection sect; @@ -1222,12 +1187,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const const QDate date = actualDate(isSet, calendar, year, year2digits, month, day, dayofweek); const QTime time = actualTime(isSet, hour, hour12, ampm, minute, second, msec); - sect = parseSection( -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) : -#endif - QDateTime(date, time, tspec, zoneOffset), - index, pos); + sect = parseSection(QDateTime(date, time, timeZone), index, pos); } QDTPDEBUG << "sectionValue" << sn.name() << m_text @@ -1262,15 +1222,18 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const const bool isUtc = zoneName == "Z"_L1 || zoneName == "UTC"_L1; if (isUtc || isUtcOffset) { - tspec = sect.value ? Qt::OffsetFromUTC : Qt::UTC; + timeZone = QTimeZone::fromSecondsAheadOfUtc(sect.value); } else { #if QT_CONFIG(timezone) - timeZone = QTimeZone(zoneName.toLatin1()); - tspec = timeZone.isValid() - ? Qt::TimeZone - : (Q_ASSERT(startsWithLocalTimeZone(zoneName)), Qt::LocalTime); + QTimeZone namedZone = QTimeZone(zoneName.toLatin1()); + if (namedZone.isValid()) { + timeZone = namedZone; + } else { + Q_ASSERT(startsWithLocalTimeZone(zoneName)); + timeZone = QTimeZone::LocalTime; + } #else - tspec = Qt::LocalTime; + timeZone = QTimeZone::LocalTime; #endif } } @@ -1412,11 +1375,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const const QDate date(year, month, day, calendar); const QTime time(hour, minute, second, msec); - const QDateTime when = -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) : -#endif - QDateTime(date, time, tspec, zoneOffset); + const QDateTime when = QDateTime(date, time, timeZone); // If hour wasn't specified, check the default we're using exists on the // given date (which might be a spring-forward, skipping an hour). @@ -1425,11 +1384,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const case QMetaType::QDateTime: { qint64 msecs = when.toMSecsSinceEpoch(); // Fortunately, that gets a useful answer, even though when is invalid ... - const QDateTime replace = -#if QT_CONFIG(timezone) - tspec == Qt::TimeZone ? QDateTime::fromMSecsSinceEpoch(msecs, timeZone) : -#endif - QDateTime::fromMSecsSinceEpoch(msecs, tspec, zoneOffset); + const QDateTime replace = QDateTime::fromMSecsSinceEpoch(msecs, timeZone); const QTime tick = replace.time(); if (replace.date() == date && (!(isSet & MinuteSection) || tick.minute() == minute) @@ -1440,11 +1395,11 @@ QDateTimeParser::scanString(const QDateTime &defaultValue, bool fixup) const } break; case QMetaType::QDate: // Don't care about time, so just use start of day (and ignore spec): - return StateNode(date.startOfDay(Qt::UTC), state, padding, conflicts); + return StateNode(date.startOfDay(QTimeZone::UTC), state, padding, conflicts); break; case QMetaType::QTime: - // Don't care about date or spec, so pick a safe spec: - return StateNode(QDateTime(date, time, Qt::UTC), state, padding, conflicts); + // Don't care about date or representation, so pick a safe representation: + return StateNode(QDateTime(date, time, QTimeZone::UTC), state, padding, conflicts); default: Q_UNREACHABLE_RETURN(StateNode()); } @@ -2192,7 +2147,7 @@ QString QDateTimeParser::stateName(State s) const // Only called when we want only one of date or time; use UTC to avoid bogus DST issues. bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time) const { - QDateTime val(QDate(1900, 1, 1).startOfDay(Qt::UTC)); + QDateTime val(QDate(1900, 1, 1).startOfDay(QTimeZone::UTC)); const StateNode tmp = parse(t, -1, val, false); if (tmp.state != Acceptable || tmp.conflicts) return false; @@ -2232,7 +2187,7 @@ QDateTime QDateTimeParser::getMinimum() const // method. At the time of writing, this is done by QDateTimeEditPrivate. // Cache the only case - static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN.startOfDay(Qt::LocalTime)); + static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN.startOfDay()); return localTimeMin; } @@ -2243,7 +2198,7 @@ QDateTime QDateTimeParser::getMaximum() const // method. At the time of writing, this is done by QDateTimeEditPrivate. // Cache the only case - static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX.endOfDay(Qt::LocalTime)); + static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX.endOfDay()); return localTimeMax; } diff --git a/src/corelib/time/qtimezone.cpp b/src/corelib/time/qtimezone.cpp index ec4ec84b5c1..3bd7489ebb7 100644 --- a/src/corelib/time/qtimezone.cpp +++ b/src/corelib/time/qtimezone.cpp @@ -331,7 +331,7 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz); For example, for time zone "Europe/Berlin" the OffsetDate in standard and DST might be: \list - \li atUtc = QDateTime(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC) + \li atUtc = QDateTime(QDate(2013, 1, 1), QTime(0, 0), QTimeZone::UTC) \li offsetFromUtc = 3600 \li standardTimeOffset = 3600 \li daylightTimeOffset = 0 @@ -339,7 +339,7 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz); \endlist \list - \li atUtc = QDateTime(QDate(2013, 6, 1), QTime(0, 0, 0), Qt::UTC) + \li atUtc = QDateTime(QDate(2013, 6, 1), QTime(0, 0), QTimeZone::UTC) \li offsetFromUtc = 7200 \li standardTimeOffset = 3600 \li daylightTimeOffset = 3600 @@ -1584,7 +1584,7 @@ QDataStream &operator>>(QDataStream &ds, QTimeZone &tz) // zone, with the right offset, ignoring the other data: tz = QTimeZone(ianaId.toUtf8()); if (!tz.isValid() || tz.hasDaylightTime() - || tz.offsetFromUtc(QDateTime::fromMSecsSinceEpoch(0, Qt::UTC)) != utcOffset) { + || tz.offsetFromUtc(QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC)) != utcOffset) { // Construct a custom timezone using the saved values: tz = QTimeZone(ianaId.toUtf8(), utcOffset, name, abbreviation, QLocale::Territory(territory), comment); diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index 53be1330dc0..f55668f3a32 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -527,7 +527,7 @@ QTimeZone::OffsetData QTimeZonePrivate::toOffsetData(const QTimeZonePrivate::Dat { QTimeZone::OffsetData offsetData = invalidOffsetData(); if (data.atMSecsSinceEpoch != invalidMSecs()) { - offsetData.atUtc = QDateTime::fromMSecsSinceEpoch(data.atMSecsSinceEpoch, Qt::UTC); + offsetData.atUtc = QDateTime::fromMSecsSinceEpoch(data.atMSecsSinceEpoch, QTimeZone::UTC); offsetData.offsetFromUtc = data.offsetFromUtc; offsetData.standardTimeOffset = data.standardTimeOffset; offsetData.daylightTimeOffset = data.daylightTimeOffset; diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp index 9056fe79cc3..960a0944185 100644 --- a/src/corelib/time/qtimezoneprivate_tz.cpp +++ b/src/corelib/time/qtimezoneprivate_tz.cpp @@ -631,20 +631,22 @@ static QList<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray Q_ASSERT(startYear <= endYear); for (int year = startYear; year <= endYear; ++year) { - // Note: std and dst, despite being QDateTime(,, Qt::UTC), have the + // Note: std and dst, despite being QDateTime(,, UTC), have the // date() and time() of the *zone*'s description of the transition // moments; the atMSecsSinceEpoch values computed from them are // correctly offse to be UTC-based. QTimeZonePrivate::Data dstData; // Transition to DST - QDateTime dst(calculatePosixDate(dstDateRule, year).startOfDay(Qt::UTC).addSecs(dstTime)); + QDateTime dst(calculatePosixDate(dstDateRule, year) + .startOfDay(QTimeZone::UTC).addSecs(dstTime)); dstData.atMSecsSinceEpoch = dst.toMSecsSinceEpoch() - stdZone.offset * 1000; dstData.offsetFromUtc = dstZone.offset; dstData.standardTimeOffset = stdZone.offset; dstData.daylightTimeOffset = dstZone.offset - stdZone.offset; dstData.abbreviation = dstZone.name; QTimeZonePrivate::Data stdData; // Transition to standard time - QDateTime std(calculatePosixDate(stdDateRule, year).startOfDay(Qt::UTC).addSecs(stdTime)); + QDateTime std(calculatePosixDate(stdDateRule, year) + .startOfDay(QTimeZone::UTC).addSecs(stdTime)); stdData.atMSecsSinceEpoch = std.toMSecsSinceEpoch() - dstZone.offset * 1000; stdData.offsetFromUtc = stdZone.offset; stdData.standardTimeOffset = stdZone.offset; @@ -655,16 +657,16 @@ static QList<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray // Handle the special case of fixed state, which may be represented // by fake transitions at start and end of each year: if (dstData.atMSecsSinceEpoch < stdData.atMSecsSinceEpoch) { - if (dst <= QDate(year, 1, 1).startOfDay(Qt::UTC) - && std >= QDate(year, 12, 31).endOfDay(Qt::UTC)) { + if (dst <= QDate(year, 1, 1).startOfDay(QTimeZone::UTC) + && std >= QDate(year, 12, 31).endOfDay(QTimeZone::UTC)) { // Permanent DST: dstData.atMSecsSinceEpoch = lastTranMSecs; result << dstData; return result; } } else { - if (std <= QDate(year, 1, 1).startOfDay(Qt::UTC) - && dst >= QDate(year, 12, 31).endOfDay(Qt::UTC)) { + if (std <= QDate(year, 1, 1).startOfDay(QTimeZone::UTC) + && dst >= QDate(year, 12, 31).endOfDay(QTimeZone::UTC)) { // Permanent Standard time, perversely described: stdData.atMSecsSinceEpoch = lastTranMSecs; result << stdData; @@ -1093,7 +1095,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::dataFromRule(QTzTransitionRule rule, QList<QTimeZonePrivate::Data> QTzTimeZonePrivate::getPosixTransitions(qint64 msNear) const { - const int year = QDateTime::fromMSecsSinceEpoch(msNear, Qt::UTC).date().year(); + const int year = QDateTime::fromMSecsSinceEpoch(msNear, QTimeZone::UTC).date().year(); // The Data::atMSecsSinceEpoch of the single entry if zone is constant: qint64 atTime = tranCache().isEmpty() ? msNear : tranCache().last().atMSecsSinceEpoch; return calculatePosixTransitions(cached_data.m_posixRule, year - 1, year + 1, atTime); |
