2015-09-06 20:19:09 +02:00
|
|
|
#include "./period.h"
|
2015-04-22 18:36:40 +02:00
|
|
|
|
|
|
|
namespace ChronoUtilities {
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \class ChronoUtilities::Period
|
|
|
|
* \brief Represents a period of time.
|
2017-12-03 01:45:11 +01:00
|
|
|
*
|
|
|
|
* In contrast to the TimeSpan class, a Period represents a duration between a concrete
|
|
|
|
* starting DateTime and end DateTime. Without that context, a Period instance is useless.
|
|
|
|
*
|
|
|
|
* Note the absence of the TimeSpan::totalYears() and TimeSpan::totalMonth() methods.
|
|
|
|
* The reason for this limitation of the TimeSpan class is that the TimeSpan is meant to express
|
|
|
|
* a duration independently of the concrete starting DateTime and end DateTime.
|
|
|
|
* However, the concrete calendar interval is neccassary for expressing a duration in terms of years
|
|
|
|
* and months because not all years and months have the same length.
|
|
|
|
*
|
|
|
|
* The Period class, on the other hand, expresses the duration between a *concrete* starting DateTime
|
|
|
|
* and end DateTime as the number of years, month and days which have been passed **in that particular
|
|
|
|
* order**. The accuracy is one day, so the DateTime::timeOfDay() is lost.
|
|
|
|
*
|
|
|
|
* \remarks The order really matters. For example, the Period between DateTime::fromDateAndTime(1994, 7, 18)
|
|
|
|
* and DateTime::fromDateAndTime(2017, 12, 2) is 23 years, 4 month and 14 days. That means
|
|
|
|
* 23 years have been passed, then 4 month and finally 14 days. Adding the 14 days first and then
|
|
|
|
* the 4 month would make a difference of one day because July has 31 days and November only 30.
|
2015-04-22 18:36:40 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2016-01-18 23:41:30 +01:00
|
|
|
* \brief Constructs a new Period defined by a start DateTime and an end DateTime.
|
2017-12-03 01:45:11 +01:00
|
|
|
*
|
|
|
|
* The resulting Period will contain the number of years, month and days which have been passed
|
|
|
|
* between \a begin and \a end.
|
|
|
|
*
|
|
|
|
* \todo Pass DateTime objects by value in v5.
|
2015-04-22 18:36:40 +02:00
|
|
|
*/
|
2017-12-03 01:45:11 +01:00
|
|
|
Period::Period(const DateTime &begin, const DateTime &end)
|
2015-04-22 18:36:40 +02:00
|
|
|
{
|
|
|
|
m_years = end.year() - beg.year();
|
|
|
|
m_months = end.month() - beg.month();
|
|
|
|
m_days = end.day() - beg.day();
|
|
|
|
if (end.hour() < beg.hour()) {
|
|
|
|
--m_days;
|
|
|
|
}
|
|
|
|
if (m_days < 0) {
|
|
|
|
m_days += DateTime::daysInMonth(beg.year(), beg.month());
|
|
|
|
--m_months;
|
|
|
|
}
|
|
|
|
if (m_months < 0) {
|
|
|
|
m_months += 12;
|
|
|
|
--m_years;
|
|
|
|
}
|
|
|
|
}
|
2017-09-17 21:45:23 +02:00
|
|
|
} // namespace ChronoUtilities
|