diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp index 7b9521fec6c..7cbe572d6e5 100644 --- a/src/plugins/sqldrivers/psql/qsql_psql.cpp +++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp @@ -651,10 +651,12 @@ QVariant QPSQLResult::data(int i) case QMetaType::QTime: return QVariant(QTime::fromString(QString::fromLatin1(val), Qt::ISODate)); case QMetaType::QDateTime: { - QString tzString(QString::fromLatin1(val)); - if (!tzString.endsWith(u'Z')) - tzString.append(u'Z'); // make UTC - return QVariant(QDateTime::fromString(tzString, Qt::ISODate)); + const QLatin1StringView tzString(val); + const auto timeString(tzString.sliced(11)); + if (timeString.contains(u'-') || timeString.contains(u'+') || timeString.endsWith(u'Z')) + return QDateTime::fromString(tzString, Qt::ISODate); + const auto utc = tzString.toString() + u'Z'; + return QVariant(QDateTime::fromString(utc, Qt::ISODate)); } #else case QMetaType::QDate: @@ -1456,8 +1458,7 @@ QString QPSQLDriver::formatValue(const QSqlField &field, bool trimStrings) const // this is safe since postgresql stores only the UTC value and not the timezone offset (only used // while parsing), so we have correct behavior in both case of with timezone and without tz r = QStringLiteral("TIMESTAMP WITH TIME ZONE ") + u'\'' + - QLocale::c().toString(dt.toUTC(), u"yyyy-MM-ddThh:mm:ss.zzz") + - u'Z' + u'\''; + dt.toOffsetFromUtc(dt.offsetFromUtc()).toString(Qt::ISODateWithMs) + u'\''; } else { r = nullStr(); }