diff --git a/src/blackmisc/pq/time.cpp b/src/blackmisc/pq/time.cpp index 4ce92c9a6..726996a73 100644 --- a/src/blackmisc/pq/time.cpp +++ b/src/blackmisc/pq/time.cpp @@ -46,7 +46,6 @@ namespace BlackMisc void CTime::parseFromString(const QString &time) { - QTime t; QString ts = time.trimmed(); // deal with sign @@ -63,11 +62,11 @@ namespace BlackMisc if (ts.contains(":") && (ts.length() == 8 || ts.length() == 5)) { - if (ts.length() == 5) - t = QTime::fromString(ts, "hh:mm"); - else if (ts.length() == 8) - t = QTime::fromString(ts, "hh:mm:ss"); - (*this) = CTime(t); + const int hour = ts.mid(0, 2).toInt(); + const int minute = ts.mid(3, 2).toInt(); + int second = 0; + if (ts.length() == 8) second = ts.mid(6, 2).toInt(); + (*this) = CTime(hour, minute, second); // fix sign if required if (factor < 0) @@ -85,28 +84,22 @@ namespace BlackMisc Q_UNUSED(mode); } - QTime CTime::toQTime() const - { - CTime copy(*this); - copy.switchUnit(CTimeUnit::hms()); - - // QTime is not defined for negative numbers - // so we use the absolute value here - copy.makePositive(); - - // convert - QString s = copy.toQString(false).replace('h', ':').replace('m', ':').replace('s', ""); - QTime t = s.length() == 8 ? - QTime::fromString(s, "hh:mm:ss") : - QTime::fromString(s, "hh:mm"); - return t; - } - QList CTime::getHrsMinSecParts() const { - QTime t = this->toQTime(); + using BlackMisc::Math::CMathUtils; + CTime copy(*this); + + copy.switchUnit(CTimeUnit::s()); + + using BlackMisc::Math::CMathUtils; + double currentValue = copy.value(); + double hr = CMathUtils::trunc(currentValue / 3600); + double remaining = std::fmod(currentValue, 3600); + double mi = CMathUtils::trunc(remaining / 60); + double se = std::fmod(remaining, 60); + QList parts; - parts << t.hour() << t.minute() << t.second(); + parts << hr << mi << se; return parts; } diff --git a/src/blackmisc/pq/time.h b/src/blackmisc/pq/time.h index 33a2ac645..0b6fe1c07 100644 --- a/src/blackmisc/pq/time.h +++ b/src/blackmisc/pq/time.h @@ -55,10 +55,6 @@ namespace BlackMisc //! From string hh:mm, or hh:mm:ss, or time units such as s, min void parseFromString(const QString &time, BlackMisc::PhysicalQuantities::CPqString::SeparatorMode mode); - //! To Qt time - //! \warning sign not considered - QTime toQTime() const; - //! Parts hh, mm, ss //! \warning sign not considered QList getHrsMinSecParts() const; diff --git a/tests/blackmisc/testphysicalquantities.cpp b/tests/blackmisc/testphysicalquantities.cpp index a32ce3739..49198e4cb 100644 --- a/tests/blackmisc/testphysicalquantities.cpp +++ b/tests/blackmisc/testphysicalquantities.cpp @@ -160,10 +160,20 @@ namespace BlackMiscTest CTime t2(1.5, CTimeUnit::h()); CTime t3(1.25, CTimeUnit::min()); CTime t4(1.0101, CTimeUnit::hms()); + CTime t5(26, 35, 40); + CTime t6(3661, CTimeUnit::s()); + CTime t7; QVERIFY2(CMathUtils::epsilonEqual(t1.value(CTimeUnit::defaultUnit()), 3600), "1hour shall be 3600s"); QVERIFY2(CMathUtils::epsilonEqual(t2.value(CTimeUnit::hrmin()), 1.3), "1.5hour shall be 1h30m"); QVERIFY2(CMathUtils::epsilonEqual(t3.value(CTimeUnit::minsec()), 1.15), "1.25min shall be 1m15s"); QVERIFY2(CMathUtils::epsilonEqual(t4.value(CTimeUnit::s()), 3661), "1h01m01s shall be 3661s"); + QVERIFY2(CMathUtils::epsilonEqual(t5.value(CTimeUnit::s()), 95740), "Time greater than 24h failed"); + QVERIFY2(t6.formattedHrsMinSec() == "01:01:01", "Formatted output hh:mm:ss failed"); + QVERIFY2(t6.formattedHrsMin() == "01:01", "Formatted output hh:mm failed"); + t6.switchUnit(CTimeUnit::hms()); + QVERIFY2(CMathUtils::epsilonEqual(t6.value(), 1.0101), "Switching the unit produced a wrong a value"); + t7.parseFromString("27:30:55"); + QVERIFY2(t7.formattedHrsMinSec() == "27:30:55", "Parsed time greater than 24h failed"); } /*