summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/time/qtimezoneprivate.cpp33
-rw-r--r--src/corelib/time/qtimezoneprivate_p.h6
-rw-r--r--tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp2
-rw-r--r--tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp13
4 files changed, 32 insertions, 22 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,
diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp
index 7815183d55..146c6b37a5 100644
--- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp
@@ -3628,7 +3628,7 @@ void tst_QDateTime::timeZones() const
QCOMPARE(nzStdOffset.date(), QDate(2012, 6, 1));
QCOMPARE(nzStdOffset.time(), QTime(12, 0));
QVERIFY(nzStdOffset.timeZone() == nzTzOffset);
- QCOMPARE(nzStdOffset.timeZone().id(), QByteArray("UTC+12:00"));
+ QCOMPARE(nzStdOffset.timeZone().id(), QByteArray("UTC+12"));
QCOMPARE(nzStdOffset.offsetFromUtc(), 43200);
QCOMPARE(nzStdOffset.isDaylightTime(), false);
QCOMPARE(nzStdOffset.toMSecsSinceEpoch(), utcStd.toMSecsSinceEpoch());
diff --git a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp
index eca258c52e..0103f92434 100644
--- a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp
+++ b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2020 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
@@ -499,6 +499,7 @@ void tst_QTimeZone::utcOffsetId()
QFETCH(int, offset);
QCOMPARE(zone.offsetFromUtc(epoch), offset);
QVERIFY(!zone.hasDaylightTime());
+ QCOMPARE(zone.id(), id);
}
}
@@ -977,11 +978,11 @@ void tst_QTimeZone::utcTest()
QCOMPARE(tzp.hasDaylightTime(), false);
QCOMPARE(tzp.hasTransitions(), false);
- // Test create from UTC Offset
+ // Test create from UTC Offset (uses minimal id, skipping minutes if 0)
QDateTime now = QDateTime::currentDateTime();
QTimeZone tz(36000);
- QCOMPARE(tz.isValid(), true);
- QCOMPARE(tz.id(), QByteArray("UTC+10:00"));
+ QVERIFY(tz.isValid());
+ QCOMPARE(tz.id(), QByteArray("UTC+10"));
QCOMPARE(tz.offsetFromUtc(now), 36000);
QCOMPARE(tz.standardTimeOffset(now), 36000);
QCOMPARE(tz.daylightTimeOffset(now), 0);
@@ -996,9 +997,9 @@ void tst_QTimeZone::utcTest()
QCOMPARE(QTimeZone(max).isValid(), true);
QCOMPARE(QTimeZone(max + 1).isValid(), false);
- // Test create from standard name
+ // Test create from standard name (preserves :00 for minutes in id):
tz = QTimeZone("UTC+10:00");
- QCOMPARE(tz.isValid(), true);
+ QVERIFY(tz.isValid());
QCOMPARE(tz.id(), QByteArray("UTC+10:00"));
QCOMPARE(tz.offsetFromUtc(now), 36000);
QCOMPARE(tz.standardTimeOffset(now), 36000);