diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index 6bf29bc0d6..98a1437f8d 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -3180,9 +3180,8 @@ static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds) static void setDateTime(QDateTimeData &d, QDate date, QTime time) { // If the date is valid and the time is not we set time to 00:00:00 - QTime useTime = time; - if (!useTime.isValid() && date.isValid()) - useTime = QTime::fromMSecsSinceStartOfDay(0); + if (!time.isValid() && date.isValid()) + time = QTime::fromMSecsSinceStartOfDay(0); QDateTimePrivate::StatusFlags newStatus = { }; @@ -3195,8 +3194,8 @@ static void setDateTime(QDateTimeData &d, QDate date, QTime time) // Set time value and status int ds = 0; - if (useTime.isValid()) { - ds = useTime.msecsSinceStartOfDay(); + if (time.isValid()) { + ds = time.msecsSinceStartOfDay(); newStatus |= QDateTimePrivate::ValidTime; } Q_ASSERT(ds < MSECS_PER_DAY); diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp index 844dead504..b8b5319ecb 100644 --- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -341,14 +341,26 @@ void tst_QDateTime::isNull() dt1.setTime(QTime()); QVERIFY(dt1.isNull()); dt1.setTimeSpec(Qt::UTC); - QVERIFY(dt1.isNull()); // maybe it should return false? + QVERIFY(dt1.isNull()); + dt1.setTime(QTime(12, 34, 56)); + QVERIFY(!dt1.isNull()); + dt1.setTime(QTime()); // Date still invalid, so this really clears time. + QVERIFY(dt1.isNull()); dt1.setDate(QDate(2004, 1, 2)); QVERIFY(!dt1.isNull()); dt1.setTime(QTime(12, 34, 56)); QVERIFY(!dt1.isNull()); - dt1.setTime(QTime()); + dt1.setTime(QTime()); // Actually sets time to QTime(0, 0), as date is still valid. QVERIFY(!dt1.isNull()); + dt1.setDate(QDate()); // Time remains valid + QVERIFY(!dt1.isNull()); + dt1.setTime(QTime()); // Now really sets time invalid, too + QVERIFY(dt1.isNull()); + + // Either date or time non-null => date-time isn't null: + QVERIFY(!QDateTime(QDate(), QTime(0, 0)).isNull()); + QVERIFY(!QDateTime(QDate(2022, 2, 16), QTime()).isNull()); } void tst_QDateTime::isValid() @@ -364,12 +376,21 @@ void tst_QDateTime::isValid() dt1.setDate(QDate(2004, 1, 2)); QVERIFY(dt1.isValid()); + dt1.setTime(QTime()); // Effectively QTime(0, 0) + QVERIFY(dt1.isValid()); dt1.setDate(QDate()); QVERIFY(!dt1.isValid()); dt1.setTime(QTime(12, 34, 56)); QVERIFY(!dt1.isValid()); - dt1.setTime(QTime()); + dt1.setTime(QTime()); // Does sets time invalid, as date is invalid QVERIFY(!dt1.isValid()); + dt1.setDate(QDate(2004, 1, 2)); // Kicks time back to QTime(0, 0) + QVERIFY(dt1.isValid()); + + // Invalid date => invalid date-time: + QVERIFY(!QDateTime(QDate(), QTime(0, 0)).isValid()); + // Invalid time gets replaced with QTime(0, 0) when date is valid: + QVERIFY(QDateTime(QDate(2022, 2, 16), QTime()).isValid()); } void tst_QDateTime::date()