mirror of https://github.com/Icinga/icinga2.git
Fix parsing of "day -X (last day of month)" in TimePeriod class
This commit is contained in:
parent
7665143afa
commit
0dc87668d6
|
@ -113,6 +113,13 @@ int LegacyTimePeriod::MonthFromString(const String& monthdef)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::gregorian::date LegacyTimePeriod::GetEndOfMonthDay(int year, int month)
|
||||||
|
{
|
||||||
|
boost::gregorian::date d(boost::gregorian::greg_year(year), boost::gregorian::greg_month(month), 1);
|
||||||
|
|
||||||
|
return d.end_of_month();
|
||||||
|
}
|
||||||
|
|
||||||
void LegacyTimePeriod::ParseTimeSpec(const String& timespec, tm *begin, tm *end, tm *reference)
|
void LegacyTimePeriod::ParseTimeSpec(const String& timespec, tm *begin, tm *end, tm *reference)
|
||||||
{
|
{
|
||||||
/* Let mktime() figure out whether we're in DST or not. */
|
/* Let mktime() figure out whether we're in DST or not. */
|
||||||
|
@ -170,10 +177,14 @@ void LegacyTimePeriod::ParseTimeSpec(const String& timespec, tm *begin, tm *end,
|
||||||
begin->tm_min = 0;
|
begin->tm_min = 0;
|
||||||
begin->tm_sec = 0;
|
begin->tm_sec = 0;
|
||||||
|
|
||||||
/* day -1: Negative days are relative to the next month. */
|
/* day -X: Negative days are relative to the next month. */
|
||||||
if (mday < 0) {
|
if (mday < 0) {
|
||||||
begin->tm_mday = mday * -1 - 1;
|
boost::gregorian::date d(GetEndOfMonthDay(reference->tm_year + 1900, mon + 1)); //TODO: Refactor this mess into full Boost.DateTime
|
||||||
begin->tm_mon++;
|
|
||||||
|
*begin = boost::gregorian::to_tm(d);
|
||||||
|
begin->tm_hour = 0;
|
||||||
|
begin->tm_min = 0;
|
||||||
|
begin->tm_sec = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,10 +196,17 @@ void LegacyTimePeriod::ParseTimeSpec(const String& timespec, tm *begin, tm *end,
|
||||||
end->tm_min = 0;
|
end->tm_min = 0;
|
||||||
end->tm_sec = 0;
|
end->tm_sec = 0;
|
||||||
|
|
||||||
/* day -1: Negative days are relative to the next month. */
|
/* day -X: Negative days are relative to the next month. */
|
||||||
if (mday < 0) {
|
if (mday < 0) {
|
||||||
end->tm_mday = mday * -1 - 1;
|
boost::gregorian::date d(GetEndOfMonthDay(reference->tm_year + 1900, mon + 1)); //TODO: Refactor this mess into full Boost.DateTime
|
||||||
end->tm_mon++;
|
|
||||||
|
// End date is one day in the future, starting 00:00:00
|
||||||
|
d = d + boost::gregorian::days(1);
|
||||||
|
|
||||||
|
*end = boost::gregorian::to_tm(d);
|
||||||
|
end->tm_hour = 0;
|
||||||
|
end->tm_min = 0;
|
||||||
|
end->tm_sec = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "icinga/i2-icinga.hpp"
|
#include "icinga/i2-icinga.hpp"
|
||||||
#include "icinga/timeperiod.hpp"
|
#include "icinga/timeperiod.hpp"
|
||||||
#include "base/dictionary.hpp"
|
#include "base/dictionary.hpp"
|
||||||
|
#include <boost/date_time/gregorian/gregorian.hpp>
|
||||||
|
|
||||||
namespace icinga
|
namespace icinga
|
||||||
{
|
{
|
||||||
|
@ -35,6 +36,8 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LegacyTimePeriod();
|
LegacyTimePeriod();
|
||||||
|
|
||||||
|
static boost::gregorian::date GetEndOfMonthDay(int year, int month);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue