From 8a680201f155a6af3d162157efa9e4802d712280 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Fri, 14 Jun 2013 13:43:16 +0200 Subject: [PATCH] Fix roundtrip conversion of datetimes. QDateTime.toString() is writing out milliseconds since change 15da0a5af20fe6771bcb94ef8d46edbd5c8fb64c. Unfortunately this breaks QDateTime::fromString() with Qt::TextDate which can't handle the new format. Fix by making QDateTime::fromString split up seconds and milliseconds on a period, if any. Now QDateTime dt = ...; assert(QDateTime::fromString(dt.toString(), Qt::TextDate) == dt) works again. Change-Id: Ibfe9032e357ceaf894e33f3e33affe94f56dbf5c Reviewed-by: Lars Knoll --- src/corelib/tools/qdatetime.cpp | 24 +++++++++++++++---- .../corelib/tools/qdatetime/tst_qdatetime.cpp | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index c137049f38d..0b4761d5b46 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -3409,13 +3409,29 @@ QDateTime QDateTime::fromString(const QString& s, Qt::DateFormat f) return QDateTime(); } - int second = (timeParts.count() > 2) ? timeParts.at(2).toInt(&ok) : 0; - if (!ok) { - return QDateTime(); + int second = 0; + int millisecond = 0; + if (timeParts.count() > 2) { + QStringList secondParts = timeParts.at(2).split(QLatin1Char('.')); + if (secondParts.size() > 2) { + return QDateTime(); + } + + second = secondParts.first().toInt(&ok); + if (!ok) { + return QDateTime(); + } + + if (secondParts.size() > 1) { + millisecond = secondParts.last().toInt(&ok); + if (!ok) { + return QDateTime(); + } + } } QDate date(year, month, day); - QTime time(hour, minute, second); + QTime time(hour, minute, second, millisecond); if (parts.count() == 5) return QDateTime(date, time, Qt::LocalTime); diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index cd7bbd22516..23c4eb33f63 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -1614,6 +1614,8 @@ void tst_QDateTime::fromStringDateFormat_data() << Qt::TextDate << invalidDateTime(); QTest::newRow("text invalid gmt minute") << QString::fromLatin1("Thu 1. Jan 1970 00:00:00 GMT+000X") << Qt::TextDate << invalidDateTime(); + QTest::newRow("text second fraction") << QString::fromLatin1("Mon 6. May 2013 01:02:03.456") + << Qt::TextDate << QDateTime(QDate(2013, 5, 6), QTime(1, 2, 3, 456)); // Test Qt::ISODate format. QTest::newRow("ISO +01:00") << QString::fromLatin1("1987-02-13T13:24:51+01:00")