diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/time/qtimezoneprivate.cpp | 33 | ||||
-rw-r--r-- | src/corelib/time/qtimezoneprivate_p.h | 6 |
2 files changed, 24 insertions, 15 deletions
diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp index 873b05295d..832f8f3e59 100644 --- a/src/corelib/time/qtimezoneprivate.cpp +++ b/src/corelib/time/qtimezoneprivate.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2013 John Layt <jlayt@kde.org> ** Contact: https://www.qt.io/licensing/ ** @@ -663,12 +663,25 @@ bool QTimeZonePrivate::isValidId(const QByteArray &ianaId) return true; } -QString QTimeZonePrivate::isoOffsetFormat(int offsetFromUtc) +QString QTimeZonePrivate::isoOffsetFormat(int offsetFromUtc, QTimeZone::NameType mode) { - const int mins = offsetFromUtc / 60; - return QString::fromUtf8("UTC%1%2:%3").arg(mins >= 0 ? QLatin1Char('+') : QLatin1Char('-')) - .arg(qAbs(mins) / 60, 2, 10, QLatin1Char('0')) - .arg(qAbs(mins) % 60, 2, 10, QLatin1Char('0')); + if (mode == QTimeZone::ShortName && !offsetFromUtc) + return utcQString(); + + char sign = '+'; + if (offsetFromUtc < 0) { + sign = '-'; + offsetFromUtc = -offsetFromUtc; + } + const int secs = offsetFromUtc % 60; + const int mins = (offsetFromUtc / 60) % 60; + const int hour = offsetFromUtc / 3600; + QString result = QString::asprintf("UTC%c%02d", sign, hour); + if (mode != QTimeZone::ShortName || secs || mins) + result += QString::asprintf(":%02d", mins); + if (mode == QTimeZone::LongName || secs) + result += QString::asprintf(":%02d", secs); + return result; } QByteArray QTimeZonePrivate::ianaIdToWindowsId(const QByteArray &id) @@ -801,13 +814,7 @@ qint64 QUtcTimeZonePrivate::offsetFromUtcString(const QByteArray &id) // Create offset from UTC QUtcTimeZonePrivate::QUtcTimeZonePrivate(qint32 offsetSeconds) { - QString utcId; - - if (offsetSeconds == 0) - utcId = utcQString(); - else - utcId = isoOffsetFormat(offsetSeconds); - + QString utcId = isoOffsetFormat(offsetSeconds, QTimeZone::ShortName); init(utcId.toUtf8(), offsetSeconds, utcId, utcId, QLocale::AnyCountry, utcId); } diff --git a/src/corelib/time/qtimezoneprivate_p.h b/src/corelib/time/qtimezoneprivate_p.h index 625aba2079..d15d7ccfea 100644 --- a/src/corelib/time/qtimezoneprivate_p.h +++ b/src/corelib/time/qtimezoneprivate_p.h @@ -1,5 +1,6 @@ /**************************************************************************** ** +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2013 John Layt <jlayt@kde.org> ** Contact: https://www.qt.io/licensing/ ** @@ -144,7 +145,8 @@ public: static QTimeZone::OffsetData invalidOffsetData(); static QTimeZone::OffsetData toOffsetData(const Data &data); static bool isValidId(const QByteArray &ianaId); - static QString isoOffsetFormat(int offsetFromUtc); + static QString isoOffsetFormat(int offsetFromUtc, + QTimeZone::NameType mode = QTimeZone::OffsetName); static QByteArray ianaIdToWindowsId(const QByteArray &ianaId); static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId); @@ -180,7 +182,7 @@ public: // Create named time zone QUtcTimeZonePrivate(const QByteArray &utcId); // Create offset from UTC - QUtcTimeZonePrivate(int offsetSeconds); + QUtcTimeZonePrivate(qint32 offsetSeconds); // Create custom offset from UTC QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name, const QString &abbreviation, QLocale::Country country, |