swift
time.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "misc/pq/time.h"
5 
6 #include <cmath>
7 
8 #include <QTime>
9 #include <QtGlobal>
10 
11 #include "misc/math/mathutils.h"
12 
14 
15 namespace swift::misc::physical_quantities
16 {
17  CTime::CTime(int hours, int minutes, int seconds) : CPhysicalQuantity(0, CTimeUnit::nullUnit())
18  {
19  bool negative = (hours < 0);
20  double value = qAbs(hours) + minutes / 100.0 + seconds / 10000.0;
21  if (minutes == 0 && seconds == 0) { (*this) = CTime(hours, CTimeUnit::h()); }
22  else
23  {
24  if (seconds == 0)
25  (*this) = CTime(value, CTimeUnit::hrmin());
26  else
27  (*this) = CTime(value, CTimeUnit::hms());
28  }
29  if (negative) { this->makeNegative(); }
30  }
31 
32  CTime::CTime(QTime time, bool negative) : CPhysicalQuantity(0, CTimeUnit::nullUnit())
33  {
34  CTime converted(time.hour(), time.minute(), time.second());
35  (*this) = converted;
36  if (negative) { this->makeNegative(); }
37  }
38 
39  void CTime::parseFromString(const QString &time)
40  {
41  QString ts = time.trimmed();
42 
43  // deal with sign
44  double factor = 1.0;
45  if (ts.startsWith('+')) { ts.remove(0, 1); }
46  else if (ts.startsWith('-'))
47  {
48  factor = -1.0;
49  ts.remove(0, 1);
50  }
51 
52  if (ts.contains(":") && (ts.length() == 8 || ts.length() == 5))
53  {
54  const int hour = QStringView { ts }.mid(0, 2).toInt();
55  const int minute = QStringView { ts }.mid(3, 2).toInt();
56  int second = 0;
57  if (ts.length() == 8) second = QStringView { ts }.mid(6, 2).toInt();
58  (*this) = CTime(hour, minute, second);
59 
60  // fix sign if required
61  if (factor < 0) { this->setValueSameUnit(this->value() * factor); }
62  }
64  }
65 
66  bool CTime::parseFromString_hhmm(const QString &hhmm)
67  {
68  if (hhmm.length() != 4) { return false; }
69  const QString hStr = hhmm.left(2);
70  const QString mStr = hhmm.right(2);
71 
72  bool ok;
73  const int h = hStr.toInt(&ok);
74  if (!ok || h < 0 || h > 23) { return false; }
75 
76  const int m = mStr.toInt(&ok);
77  if (!ok || m < 0 || m > 59) { return false; }
78 
79  *this = CTime(h, m, 0);
80  return true;
81  }
82 
83  void CTime::parseFromString(const QString &time, CPqString::SeparatorMode mode)
84  {
85  this->parseFromString(time);
86  Q_UNUSED(mode);
87  }
88 
89  QList<int> CTime::getHrsMinSecParts() const
90  {
91  CTime copy(*this);
92  copy.switchUnit(CTimeUnit::s());
93 
94  const double currentValue = copy.value();
95  const double hr = CMathUtils::trunc(currentValue / 3600);
96  const double remaining = std::fmod(currentValue, 3600);
97  const double mi = CMathUtils::trunc(remaining / 60);
98  const double se = CMathUtils::trunc(std::fmod(remaining, 60));
99 
100  QList<int> parts;
101  parts << qRound(hr) << qRound(mi) << qRound(se);
102  return parts;
103  }
104 
106  {
107  const QList<int> parts = getHrsMinSecParts();
108  const QString h = QStringLiteral("00%1").arg(QString::number(parts.at(0))).right(2);
109  const QString m = QStringLiteral("00%1").arg(QString::number(parts.at(1))).right(2);
110  const QString s = QStringLiteral("00%1").arg(QString::number(parts.at(2))).right(2);
111 
112  const QString fs = QStringLiteral("%1:%2:%3").arg(h, m, s);
113  if (this->isNegativeWithEpsilonConsidered()) { return QStringLiteral("-").append(fs); }
114  else { return fs; }
115  }
116 
117  int CTime::toMs() const
118  {
119  const double ms = this->valueRounded(CTimeUnit::ms(), 0);
120  return static_cast<int>(ms);
121  }
122 
123  int CTime::toSeconds() const
124  {
125  const double ms = this->valueRounded(CTimeUnit::s(), 0);
126  return static_cast<int>(ms);
127  }
128 
129  QString CTime::formattedHrsMin() const
130  {
131  const QList<int> parts = getHrsMinSecParts();
132  const QString h = QStringLiteral("00%1").arg(QString::number(parts.at(0))).right(2);
133  const QString m = QStringLiteral("00%1").arg(QString::number(parts.at(1))).right(2);
134  const QString fs = QStringLiteral("%1:%2").arg(h, m);
135  if (this->isNegativeWithEpsilonConsidered()) { return QString("-").append(fs); }
136  else { return fs; }
137  }
138 
139  QDateTime CTime::toQDateTime() const
140  {
141  QDateTime dt = QDateTime::currentDateTimeUtc();
142  dt.setTime(this->toQTime());
143  return dt;
144  }
145 
146  QTime CTime::toQTime() const
147  {
148  const QList<int> parts = this->getHrsMinSecParts();
149  const QTime t(parts[0], parts[1], parts[2]);
150  return t;
151  }
152 } // namespace swift::misc::physical_quantities
static double trunc(double value, double epsilon=1e-10)
Nearest integer not greater in magnitude than value, correcting for epsilon.
Definition: mathutils.h:52
A physical quantity such as "5m", "20s", "1500ft/s".
bool isNegativeWithEpsilonConsidered() const
Value <= 0 epsilon considered.
void setValueSameUnit(double value)
Change value without changing unit.
void parseFromString(const QString &value)
Parse value from string.
PQ & switchUnit(const MU &newUnit)
Change unit, and convert value to maintain the same quantity.
double value(MU unit) const
Value in given unit.
double valueRounded(CTimeUnit unit, int digits=-1) const
Rounded value in given unit.
SeparatorMode
Number separators / group separators.
Definition: pqstring.h:34
void parseFromString(const QString &time)
From string hh:mm, or hh:mm:ss, or time units such as s, min.
Definition: time.cpp:39
int toMs() const
Convenience functions when used with timers etc.
Definition: time.cpp:117
QList< int > getHrsMinSecParts() const
Parts hh, mm, ss.
Definition: time.cpp:89
QString formattedHrsMin() const
Formatted as hh:mm.
Definition: time.cpp:129
int toSeconds() const
Convenience functions when used with timers etc.
Definition: time.cpp:123
QDateTime toQDateTime() const
To Qt date time.
Definition: time.cpp:139
CTime()
Default constructor.
Definition: time.h:37
QTime toQTime() const
To Qt time.
Definition: time.cpp:146
bool parseFromString_hhmm(const QString &hhmm)
From string like 2211 (hhmm)
Definition: time.cpp:66
QString formattedHrsMinSec() const
Formatted as hh:mm:ss.
Definition: time.cpp:105
Specialized class for time units (ms, hour, min).
Definition: units.h:909
static CTimeUnit hrmin()
Hours, minutes.
Definition: units.h:1007
static CTimeUnit hms()
Hours, minutes, seconds.
Definition: units.h:996
static CTimeUnit s()
Second s.
Definition: units.h:954
static CTimeUnit ms()
Millisecond ms.
Definition: units.h:962