From: Janne Koschinski Date: Fri, 26 Jul 2019 13:28:11 +0000 (+0200) Subject: Simplify the time formatting used in formatDateTimeToISO X-Git-Tag: test-travis-01~47^2 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=f661cc01b740b69c881010fecc847db8d479a263;ds=sidebyside Simplify the time formatting used in formatDateTimeToISO - Previously, a convoluted workaround using deprecated functionality was used to ensure we would format all types of QDateTime objects correctly - A new workaround has been found which ensures this works reliably without using deprecated functionality --- diff --git a/src/common/util.cpp b/src/common/util.cpp index aaf3acaa..728b8ca4 100644 --- a/src/common/util.cpp +++ b/src/common/util.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -357,32 +358,7 @@ QString formatDateTimeToOffsetISO(const QDateTime& dateTime) // See https://en.wikipedia.org/wiki/ISO_8601#cite_note-32 // And https://www.ietf.org/rfc/rfc3339.txt -#if 0 // The expected way to get a UTC offset on ISO 8601 dates // Remove the "T" date/time separator - return dateTime.toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate).replace(10, 1, " "); -#else - // Work around Qt bug that converts to UTC instead of including timezone information - // See https://bugreports.qt.io/browse/QTBUG-26161 - // - // NOTE: Despite the bug report marking as fixed in Qt 5.2.0 (QT_VERSION >= 0x050200), this - // still appears broken in Qt 5.5.1. - // - // Credit to "user362638" for the solution below, modified to fit Quassel's needs - // https://stackoverflow.com/questions/18750569/qdatetime-isodate-with-timezone - - // Get the local and UTC time - QDateTime local = QDateTime(dateTime); - QDateTime utc = local.toUTC(); - utc.setTimeSpec(Qt::LocalTime); - - // Find the UTC offset - int utcOffset = utc.secsTo(local); - - // Force the local time to follow this offset - local.setUtcOffset(utcOffset); - // Now the output should be correct - // Remove the "T" date/time separator - return local.toString(Qt::ISODate).replace(10, 1, " "); -#endif + return dateTime.toOffsetFromUtc(dateTime.offsetFromUtc()).toString(Qt::ISODate).replace(10, 1, " "); } diff --git a/tests/common/CMakeLists.txt b/tests/common/CMakeLists.txt index 9ca7d4f8..f0319770 100644 --- a/tests/common/CMakeLists.txt +++ b/tests/common/CMakeLists.txt @@ -10,3 +10,5 @@ quassel_add_test(SignalProxyTest LIBRARIES Quassel::Test::Util ) + +quassel_add_test(UtilTest) diff --git a/tests/common/utiltest.cpp b/tests/common/utiltest.cpp new file mode 100644 index 00000000..55f5329e --- /dev/null +++ b/tests/common/utiltest.cpp @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (C) 2005-2019 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "testglobal.h" +#include "util.h" +#include +#include +#include + +TEST(UtilTest, formatDateTimeToOffsetISO) { + QDateTime dateTime{{2006, 01, 02}, {15, 04, 05}, QTimeZone{"UTC+01:00"}}; + + ASSERT_TRUE(dateTime.isValid()); + ASSERT_FALSE(dateTime.isNull()); + + EXPECT_EQ(formatDateTimeToOffsetISO(dateTime), QString("2006-01-02 15:04:05+01:00")); + EXPECT_EQ(formatDateTimeToOffsetISO(dateTime.toUTC()), QString("2006-01-02 14:04:05Z")); + EXPECT_EQ(formatDateTimeToOffsetISO(dateTime.toOffsetFromUtc(0)), QString("2006-01-02 14:04:05Z")); + EXPECT_EQ(formatDateTimeToOffsetISO(dateTime.toOffsetFromUtc(7200)), QString("2006-01-02 16:04:05+02:00")); + EXPECT_EQ(formatDateTimeToOffsetISO(dateTime.toTimeZone(QTimeZone{"UTC"})), QString("2006-01-02 14:04:05Z")); +} \ No newline at end of file