|
Boost : |
From: Jeff Garland (jeff_at_[hidden])
Date: 2003-01-13 10:06:44
>Btw, by recurring events I mean events which can be configured to
occur
>for example: every monday and thursday, last friday in month,
>every second tuesday, every friday the 13th, and so on...
>Much like crontab or MS-Outlook's recurrence appointments.
>
>Unfortunately, there is no such class in the Date-Time library.
I don't
>know, but maybe such a class doesn't fit in a library?
I believe it would be a perfect fit with the library. The only
reason it isn't there is time. I would be happy to collaborate
with you on building such an extension :-)
>Anyhow, I think it would be really nice to say something like:
>recurring_event<daily> wakeMeUp("09:45");
>recurring_event<weekly> trainingDays(monday,thursday);
>recurring_event<weekly> cleaningDay(tuesday,every_2nd);
>recurring_event<monthly> receiveSalary(friday,last_day_in_month);
>recurring_event<yearly> santa(christmas_day);
In general, what you want to do here is very similar to the
generator concept. See
http://www.boost.org/libs/date_time/doc/date_algorithms.html
for some ideas. For example your receiveSalary on the last
friday of the month is very similar to the 'last_kday_of_month'
which performs the following calculation:
last_kday_of_month lkm(Friday,Jan);
date d = lkm.get_date(2002);//2002-Jan-28
date d2 = lkm.get_date(2003); //2003-Jan-31
>Does anyone have an idea or hint how to implement such a class (maybe
>out of different boost-classes)? Otherwise I know one way to go, based
>on the paper "Recurring Events" written by Martin Fowler and available
>on his site martinfowler.com.
I believe most of the tools you need are already in the library.
It is really a matter of putting them together in a way that is
useful to your application. For example
recurring_event<daily> wakeMeUp("09:45");
is easily specified as a time duration offset from midnight. That
is
using namespace boost::gregorian;
using namespace boost::posix_time;
//warning -- untested code!
class daily_event {
daily_event(time_duration td) :
offset_from_midnight(td)
{}
//use this to generate wakeup time for any date....
ptime getWakeUpTime(date d)
{
return ptime(d, offset_from_midnight);
}
private:
time_duration offset_from_midnight;
};
Jeff
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk