From baf5eed1ef5a71cdcf4ee56cb3e9c9eaa45ea60b Mon Sep 17 00:00:00 2001 From: Daniel Seither Date: Tue, 4 Feb 2014 12:36:27 +0100 Subject: QDateTime: Fix sign handling in the timezone offset parser Previously, parsing negative timezone offsets with minutes != 00 produced wrong results. Examples (in -> out) -00:15 -> +00:15 -01:15 -> -00:45 Change-Id: I6fa30810a08bdf2996365661720b2e362e8aeb93 Reviewed-by: Thiago Macieira Reviewed-by: John Layt --- src/corelib/tools/qdatetime.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index e38a5f569a..280d516452 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -265,17 +265,24 @@ static int fromOffsetString(const QString &offsetString, bool *valid) if (size < 2 || size > 6) return 0; + // sign will be +1 for a positive and -1 for a negative offset + int sign; + // First char must be + or - - const QChar sign = offsetString.at(0); - if (sign != QLatin1Char('+') && sign != QLatin1Char('-')) + const QChar signChar = offsetString.at(0); + if (signChar == QLatin1Char('+')) + sign = 1; + else if (signChar == QLatin1Char('-')) + sign = -1; + else return 0; // Split the hour and minute parts - QStringList parts = offsetString.split(QLatin1Char(':')); + QStringList parts = offsetString.mid(1).split(QLatin1Char(':')); if (parts.count() == 1) { // [+-]HHMM format - parts.append(parts.at(0).mid(3)); - parts[0] = parts.at(0).left(3); + parts.append(parts.at(0).mid(2)); + parts[0] = parts.at(0).left(2); } bool ok = false; @@ -288,7 +295,7 @@ static int fromOffsetString(const QString &offsetString, bool *valid) return 0; *valid = true; - return ((hour * 60) + minute) * 60; + return sign * ((hour * 60) + minute) * 60; } /***************************************************************************** -- cgit v1.2.3