time.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "time.h"
  2. #include "math.h"
  3. namespace OPL {
  4. Time::Time(const DateTimeFormat &format)
  5. : m_format(format),
  6. m_minutes(-1)
  7. {}
  8. Time::Time(const QTime &qTime, const DateTimeFormat &format)
  9. {
  10. m_minutes = qTime.isValid() ? qTime.minute() + qTime.hour() * 60 : -1;
  11. }
  12. Time::Time(int32_t minutes, const DateTimeFormat &format)
  13. : m_minutes(minutes), m_format(format)
  14. {}
  15. bool Time::isValidTimeOfDay() const
  16. {
  17. return isValid() && m_minutes <= MINUTES_PER_DAY;
  18. }
  19. bool Time::isValid() const
  20. {
  21. return m_minutes >= 0;
  22. }
  23. const QString Time::toString() const
  24. {
  25. switch(m_format.timeFormat()) {
  26. case DateTimeFormat::TimeFormat::Default:
  27. return QString::number(m_minutes / 60).rightJustified(2, '0')
  28. + ':'
  29. + QString::number(m_minutes % 60).rightJustified(2, '0');
  30. case DateTimeFormat::TimeFormat::Decimal:
  31. return QString::number(m_minutes / 60.0, 'f', 2);
  32. break;
  33. case DateTimeFormat::TimeFormat::Custom:
  34. return QTime(0, m_minutes, 0).toString(m_format.timeFormatString());
  35. default:
  36. return QString();
  37. }
  38. }
  39. int32_t Time::toMinutes() const
  40. {
  41. return m_minutes;
  42. }
  43. Time Time::fromString(const QString &timeString, const DateTimeFormat &format)
  44. {
  45. switch(format.timeFormat()) {
  46. case DateTimeFormat::TimeFormat::Default:
  47. {
  48. const auto qTime = QTime::fromString(timeString, QStringLiteral("hh:mm"));
  49. return Time(qTime, format);
  50. break;
  51. }
  52. case DateTimeFormat::TimeFormat::Decimal:
  53. {
  54. // try to convert string to double
  55. bool ok = false;
  56. const double timeValue = timeString.toDouble(&ok);
  57. if(!ok) {
  58. return {-1, format};
  59. }
  60. // extract integer and fractional part
  61. double hours, minutes;
  62. hours = modf(timeValue, &minutes);
  63. // create the Time Object
  64. return(Time(hours * 60 + minutes, format));
  65. break;
  66. }
  67. case DateTimeFormat::TimeFormat::Custom:
  68. const auto qTime = QTime::fromString(timeString, format.timeFormatString());
  69. return Time(qTime, format);
  70. break;
  71. }
  72. }
  73. Time Time::blockTime(const Time &offBlocks, const Time &onBlocks)
  74. {
  75. // make sure both times are in 24h range
  76. bool bothTimesAreValid = offBlocks.isValidTimeOfDay() && onBlocks.isValidTimeOfDay();
  77. if(!bothTimesAreValid)
  78. return {-1, offBlocks.m_format};
  79. // calculate the block time
  80. if(onBlocks.m_minutes > offBlocks.m_minutes) {
  81. // take-off and landing on the same day
  82. return Time(onBlocks.m_minutes - offBlocks.m_minutes, offBlocks.m_format);
  83. } else {
  84. if(offBlocks.m_minutes == onBlocks.m_minutes)
  85. return Time(0, offBlocks.m_format);
  86. // landing the day after take off
  87. int minutesToMidnight = MINUTES_PER_DAY - offBlocks.m_minutes;
  88. return Time(minutesToMidnight + onBlocks.m_minutes, offBlocks.m_format);
  89. }
  90. }
  91. int32_t Time::blockMinutes(const Time &offBlocks, const Time &onBlocks)
  92. {
  93. return blockTime(offBlocks, onBlocks).toMinutes();
  94. }
  95. } // namespace OPL