diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 6c8fb85233..174b694eee 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -1863,6 +1863,25 @@ int QTime::msecsTo(const QTime &t) const otherwise returns false. */ +/*! + \fn QTime QTime::fromMSecsSinceStartOfDay(int msecs) + + Returns a new QTime instance with the time set to the number of \a msecs + since the start of the day, i.e. since 00:00:00. + + If \a msecs falls outside the valid range an invalid QTime will be returned. + + \sa msecsSinceStartOfDay() +*/ + +/*! + \fn int QTime::msecsSinceStartOfDay() const + + Returns the number of msecs since the start of the day, i.e. since 00:00:00. + + \sa fromMSecsSinceStartOfDay() +*/ + /*! \fn QTime::currentTime() @@ -2695,7 +2714,7 @@ void QDateTime::setMSecsSinceEpoch(qint64 msecs) } d->date = QDate(1970, 1, 1).addDays(ddays); - d->time = QTime(0, 0, 0).addMSecs(msecs); + d->time = QTime::fromMSecsSinceStartOfDay(msecs); if (d->spec == QDateTimePrivate::OffsetFromUTC) utcToOffset(&d->date, &d->time, d->m_offsetFromUtc); @@ -4449,7 +4468,7 @@ uint qHash(const QDate &key, uint seed) Q_DECL_NOTHROW */ uint qHash(const QTime &key, uint seed) Q_DECL_NOTHROW { - return qHash(QTime(0, 0, 0, 0).msecsTo(key), seed); + return qHash(key.msecsSinceStartOfDay(), seed); } QT_END_NAMESPACE diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h index 8b63c5a377..779aae5b5b 100644 --- a/src/corelib/tools/qdatetime.h +++ b/src/corelib/tools/qdatetime.h @@ -168,6 +168,9 @@ public: bool operator>(const QTime &other) const { return mds > other.mds; } bool operator>=(const QTime &other) const { return mds >= other.mds; } + static inline QTime fromMSecsSinceStartOfDay(int msecs) { QTime t; t.mds = msecs; return t; } + inline int msecsSinceStartOfDay() const { return mds == NullTime ? 0 : mds; } + static QTime currentTime(); #ifndef QT_NO_DATESTRING static QTime fromString(const QString &s, Qt::DateFormat f = Qt::TextDate); diff --git a/tests/auto/corelib/tools/qtime/tst_qtime.cpp b/tests/auto/corelib/tools/qtime/tst_qtime.cpp index 864f90b380..3941794202 100644 --- a/tests/auto/corelib/tools/qtime/tst_qtime.cpp +++ b/tests/auto/corelib/tools/qtime/tst_qtime.cpp @@ -75,6 +75,8 @@ private slots: void toStringFormat_data(); void toStringFormat(); void toStringLocale(); + void msecsSinceStartOfDay_data(); + void msecsSinceStartOfDay(); private: QTime invalidTime() { return QTime(-1, -1, -1); } @@ -732,5 +734,49 @@ void tst_QTime::toStringLocale() QLocale().toString(time, QLocale::ShortFormat)); } +void tst_QTime::msecsSinceStartOfDay_data() +{ + QTest::addColumn("msecs"); + QTest::addColumn("isValid"); + QTest::addColumn("hour"); + QTest::addColumn("minute"); + QTest::addColumn("second"); + QTest::addColumn("msec"); + + QTest::newRow("00:00:00.000") << 0 << true + << 0 << 0 << 0 << 0; + QTest::newRow("01:00:00.001") << ((1 * 3600 * 1000) + 1) << true + << 1 << 0 << 0 << 1; + QTest::newRow("03:04:05.678") << ((3 * 3600 + 4 * 60 + 5) * 1000 + 678) << true + << 3 << 4 << 5 << 678; + QTest::newRow("23:59:59.999") << ((23 * 3600 + 59 * 60 + 59) * 1000 + 999) << true + << 23 << 59 << 59 << 999; + QTest::newRow("24:00:00.000") << ((24 * 3600) * 1000) << false + << -1 << -1 << -1 << -1; + QTest::newRow("-1 invalid") << -1 << false + << -1 << -1 << -1 << -1; +} + +void tst_QTime::msecsSinceStartOfDay() +{ + QFETCH(int, msecs); + QFETCH(bool, isValid); + QFETCH(int, hour); + QFETCH(int, minute); + QFETCH(int, second); + QFETCH(int, msec); + + QTime time = QTime::fromMSecsSinceStartOfDay(msecs); + QCOMPARE(time.isValid(), isValid); + if (msecs >= 0) + QCOMPARE(time.msecsSinceStartOfDay(), msecs); + else + QCOMPARE(time.msecsSinceStartOfDay(), 0); + QCOMPARE(time.hour(), hour); + QCOMPARE(time.minute(), minute); + QCOMPARE(time.second(), second); + QCOMPARE(time.msec(), msec); +} + QTEST_APPLESS_MAIN(tst_QTime) #include "tst_qtime.moc"