Files
pilotclient/src/blackmisc/pq/time.cpp
Roland Winklmeier 86b238a092 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.
2015-11-19 20:57:40 +00:00

141 lines
4.5 KiB
C++

/* Copyright (C) 2013
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
* including this file, may be copied, modified, propagated, or distributed except according to the terms
* contained in the LICENSE file.
*/
#include "blackmisc/pq/time.h"
namespace BlackMisc
{
namespace PhysicalQuantities
{
CTime::CTime(int hours, int minutes, int seconds) : CPhysicalQuantity(0, CTimeUnit::nullUnit())
{
bool negative = (hours < 0);
double value = qAbs(hours) + minutes / 100.0 + seconds / 10000.0;
if (minutes == 0 && seconds == 0)
{
(*this) = CTime(hours, CTimeUnit::h());
}
else
{
if (seconds == 0)
(*this) = CTime(value, CTimeUnit::hrmin());
else
(*this) = CTime(value, CTimeUnit::hms());
}
if (negative)
{
this->makeNegative();
}
}
CTime::CTime(const QTime &time, bool negative) : CPhysicalQuantity(0, CTimeUnit::nullUnit())
{
CTime converted(time.hour(), time.minute(), time.second());
(*this) = converted;
if (negative)
{
this->makeNegative();
}
}
void CTime::parseFromString(const QString &time)
{
QString ts = time.trimmed();
// deal with sign
double factor = 1.0;
if (ts.startsWith('+'))
{
ts.remove(0, 1);
}
else if (ts.startsWith('-'))
{
factor = -1.0;
ts.remove(0, 1);
}
if (ts.contains(":") && (ts.length() == 8 || ts.length() == 5))
{
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)
{
this->setValueSameUnit(this->value() * factor);
}
}
else
CPhysicalQuantity::parseFromString(time);
}
void CTime::parseFromString(const QString &time, CPqString::SeparatorMode mode)
{
this->parseFromString(time);
Q_UNUSED(mode);
}
QList<int> CTime::getHrsMinSecParts() const
{
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<int> parts;
parts << hr << mi << se;
return parts;
}
QString CTime::formattedHrsMinSec() const
{
QList<int> parts = getHrsMinSecParts();
QString h = QString("00%1").arg(QString::number(parts.at(0))).right(2);
QString m = QString("00%1").arg(QString::number(parts.at(1))).right(2);
QString s = QString("00%1").arg(QString::number(parts.at(2))).right(2);
QString fs = QString("%1:%2:%3").arg(h).arg(m).arg(s);
if (this->isNegativeWithEpsilonConsidered())
{
return QString("-").append(fs);
}
else
{
return fs;
}
}
QString CTime::formattedHrsMin() const
{
QList<int> parts = getHrsMinSecParts();
QString h = QString("00%1").arg(QString::number(parts.at(0))).right(2);
QString m = QString("00%1").arg(QString::number(parts.at(1))).right(2);
QString fs = QString("%1:%2").arg(h).arg(m);
if (this->isNegativeWithEpsilonConsidered())
{
return QString("-").append(fs);
}
else
{
return fs;
}
}
}
}