From 86b238a092207a462f8a0072c2d2c40ecf78b71f Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Wed, 8 Jul 2015 00:34:09 +0200 Subject: [PATCH] refs #449 Remove internal usage of QTime in CTime QTime does not support values greater than 24 hours. Therefore parsing from such values or conversions failed. This commit reimplements all necessary methods without using QTime. --- src/blackmisc/pq/time.cpp | 43 +++++++++------------- src/blackmisc/pq/time.h | 4 -- tests/blackmisc/testphysicalquantities.cpp | 10 +++++ 3 files changed, 28 insertions(+), 29 deletions(-) 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"); } /*