[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Detecting holidays

Daniel Berger

1/2/2007 4:32:00 PM

Hi all,

Well, it took seven years, but I've finally been annoyed enough by
reports failing on national holidays to say something. Report writers
know the routine:

Them: Why did the report fail for Jan. 1st?
Me: National holiday. There was no data to grab. Ignore the failure.
Them: Oh, right.

Repeat again for Memorial Day, July 4th, Thanksgiving, and Christmas.

Is there a package out there that deals with national holidays (for any
nation)? The only thing I came across what date2, but that only seems
to handle Japanese national holidays. I guess I'm looking for
something like Perl's Date::Calc [1] module or, more specifically, it's
Date::Calendar::Profiles [2] module. Or something like Perl's
Date::Holidays::XXX [3] approach (I'm not sure which is preferred these
days).

Ideally, I'd like to be able to do something like:

if Date.today.is_national_holiday?
exit # Don't run report on this day
end

And no, it's not a simple matter of using something more flexible than
cron because some reports pull data from X days back or ahead, not on
the date they're run.

Thoughts?

- Dan

[1] http://search.cpan.org/~stbey/Date-Calc-5.4/Ca...
[2]
http://search.cpan.org/~stbey/Date-Calc-5.4/lib/Date/Calendar/Pr...
[3]
http://search.cpan.org/~jonasbn/Date-Holidays-0.08/lib/Date/H...

21 Answers

Jeremy McAnally

1/2/2007 4:56:00 PM

0

Try this:

class Date
def is_national_holiday?
this_year = self.year.to_s
# Not perfect; Thanksgiving and Easter change...
dates = [this_year + '-12-25', this_year + '-12-24', this_year +
'-1-1', this_year + '-7-4', this_year + '-11-28']

if (dates.include?(self.to_s)):
return true
else
return false
end
end
end



irb(main):263:0> christmas = Date.parse('2007-12-25')
=> #<Date: 4908919/2,0,2299161>
irb(main):264:0> christmas.is_national_holiday?
=> true
irb(main):265:0> today = Date.today
=> #<Date: 4908205/2,0,2299161>
irb(main):266:0> today.is_national_holiday?
=> false

Again, it doesn't get Thanksgiving right or others that change like
Easter. If you want, I could hack it in; otherwise, this should get
you on the right path. ;)

--Jeremy

On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:
> Hi all,
>
> Well, it took seven years, but I've finally been annoyed enough by
> reports failing on national holidays to say something. Report writers
> know the routine:
>
> Them: Why did the report fail for Jan. 1st?
> Me: National holiday. There was no data to grab. Ignore the failure.
> Them: Oh, right.
>
> Repeat again for Memorial Day, July 4th, Thanksgiving, and Christmas.
>
> Is there a package out there that deals with national holidays (for any
> nation)? The only thing I came across what date2, but that only seems
> to handle Japanese national holidays. I guess I'm looking for
> something like Perl's Date::Calc [1] module or, more specifically, it's
> Date::Calendar::Profiles [2] module. Or something like Perl's
> Date::Holidays::XXX [3] approach (I'm not sure which is preferred these
> days).
>
> Ideally, I'd like to be able to do something like:
>
> if Date.today.is_national_holiday?
> exit # Don't run report on this day
> end
>
> And no, it's not a simple matter of using something more flexible than
> cron because some reports pull data from X days back or ahead, not on
> the date they're run.
>
> Thoughts?
>
> - Dan
>
> [1] http://search.cpan.org/~stbey/Date-Calc-5.4/Ca...
> [2]
> http://search.cpan.org/~stbey/Date-Calc-5.4/lib/Date/Calendar/Pr...
> [3]
> http://search.cpan.org/~jonasbn/Date-Holidays-0.08/lib/Date/H...
>
>
>


--
My free Ruby e-book:
http://www.humblelittlerubybook...

My blogs:
http://www.mrneigh...
http://www.rubyinpra...

Kieran Tully

1/2/2007 5:10:00 PM

0

On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:

> Them: Why did the report fail for Jan. 1st?
> Me: National holiday. There was no data to grab. Ignore the failure.
> Them: Oh, right.
[snip]
> Ideally, I'd like to be able to do something like:
>
> if Date.today.is_national_holiday?
> exit # Don't run report on this day
> end

Nice, but won't this just change the problem to:

Them: Why is there no report for Jan. 1st?


What currently happens when the report 'fails'? Could you generate an
empty report that says

'No data available for today. Was it a holiday?'

That might solve your actual problem, without introducing a 'holidays'
module. Though if your reports often fail for other reasons, perhaps
you do need to detect holidays to distinguish them rom real error
conditions.
--
Kieran Tully, Software Developer and Tenor, http://...

Daniel Berger

1/2/2007 5:19:00 PM

0


Kieran Tully wrote:
> On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:
>
> > Them: Why did the report fail for Jan. 1st?
> > Me: National holiday. There was no data to grab. Ignore the failure.
> > Them: Oh, right.
> [snip]
> > Ideally, I'd like to be able to do something like:
> >
> > if Date.today.is_national_holiday?
> > exit # Don't run report on this day
> > end
>
> Nice, but won't this just change the problem to:
>
> Them: Why is there no report for Jan. 1st?
>
>
> What currently happens when the report 'fails'? Could you generate an
> empty report that says
>
> 'No data available for today. Was it a holiday?'

True, I may end up doing that in practice.

> That might solve your actual problem, without introducing a 'holidays'
> module. Though if your reports often fail for other reasons, perhaps
> you do need to detect holidays to distinguish them rom real error
> conditions.

Yes, sometimes they fail for other reasons, such as the network or
database flaking out briefly. So, in practice I see myself doing
something like:

begin
# main report body
rescue ReportException
if Date.today.is_national_holiday?
# note in log that it was a holiday, in case anyone asks.
else
raise
end
end

It might be a little trickier than that in practice, but that's the
general idea.

Regards,

Dan

Bira

1/2/2007 5:35:00 PM

0

On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:
> Hi all,
>
> Well, it took seven years, but I've finally been annoyed enough by
> reports failing on national holidays to say something. Report writers
> know the routine:

<...>

The best way I know of checking for holidays is somehow keeping a
record of which dates are holidays in a given year. It can be a
database table, or some sort of configuration files when that isn't
possible.

This record would have to be mantained manually, but it would be just
a simple case of editing the table/file every time you buy a new
calendar :).

--
Bira
http://compexplicita.bl...
http://sinfoniaferida.bl...

brabuhr

1/2/2007 5:57:00 PM

0

On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:
> Is there a package out there that deals with national holidays (for any
> nation)? The only thing I came across what date2, but that only seems
> to handle Japanese national holidays. I guess I'm looking for
> something like Perl's Date::Calc [1] module or, more specifically, it's
> Date::Calendar::Profiles [2] module. Or something like Perl's
> Date::Holidays::XXX [3] approach (I'm not sure which is preferred these
> days).
>
> Ideally, I'd like to be able to do something like:
>
> if Date.today.is_national_holiday?
> exit # Don't run report on this day
> end

You may be able to build something that checks againt an iCalendar
file of holidays.

* webcal://ical.mac.com/ical/US32Holidays.ics
* http://www.infinitenil.com/devel...
* http://www.macdevcenter.com/pub/a/mac/2003/09/03/ruby...

Mat Schaffer

1/2/2007 6:59:00 PM

0


On Jan 2, 2007, at 11:56 AM, Jeremy McAnally wrote:

> Try this:
>
> class Date
> def is_national_holiday?
> this_year = self.year.to_s
> # Not perfect; Thanksgiving and Easter change...
> dates = [this_year + '-12-25', this_year + '-12-24', this_year +
> '-1-1', this_year + '-7-4', this_year + '-11-28']
>
> if (dates.include?(self.to_s)):
> return true
> else
> return false
> end
> end
> end
>
>
>
> irb(main):263:0> christmas = Date.parse('2007-12-25')
> => #<Date: 4908919/2,0,2299161>
> irb(main):264:0> christmas.is_national_holiday?
> => true
> irb(main):265:0> today = Date.today
> => #<Date: 4908205/2,0,2299161>
> irb(main):266:0> today.is_national_holiday?
> => false
>
> Again, it doesn't get Thanksgiving right or others that change like
> Easter. If you want, I could hack it in; otherwise, this should get
> you on the right path. ;)

For those sort of holidays you could use the Chronic gem to parse a
textual date:

irb(main):010:0> Chronic.parse('4th thursday in november')
=> Thu Nov 22 11:00:00 -0500 2007

Still kind of a shame there isn't just a 'holidays' gem.

-Mat

Jeremy McAnally

1/2/2007 7:04:00 PM

0

I thought of Chronic (a fine library that I use often!); I'm toying
around with it right now and I think I have it figured out (without
using Chronic)...

I'll re-post the code later on...and maybe make a little gem for those
(i.e, four people) who need it. ;)

--Jeremy

On 1/2/07, Mat Schaffer <schapht@gmail.com> wrote:
>
> On Jan 2, 2007, at 11:56 AM, Jeremy McAnally wrote:
>
> > Try this:
> >
> > class Date
> > def is_national_holiday?
> > this_year = self.year.to_s
> > # Not perfect; Thanksgiving and Easter change...
> > dates = [this_year + '-12-25', this_year + '-12-24', this_year +
> > '-1-1', this_year + '-7-4', this_year + '-11-28']
> >
> > if (dates.include?(self.to_s)):
> > return true
> > else
> > return false
> > end
> > end
> > end
> >
> >
> >
> > irb(main):263:0> christmas = Date.parse('2007-12-25')
> > => #<Date: 4908919/2,0,2299161>
> > irb(main):264:0> christmas.is_national_holiday?
> > => true
> > irb(main):265:0> today = Date.today
> > => #<Date: 4908205/2,0,2299161>
> > irb(main):266:0> today.is_national_holiday?
> > => false
> >
> > Again, it doesn't get Thanksgiving right or others that change like
> > Easter. If you want, I could hack it in; otherwise, this should get
> > you on the right path. ;)
>
> For those sort of holidays you could use the Chronic gem to parse a
> textual date:
>
> irb(main):010:0> Chronic.parse('4th thursday in november')
> => Thu Nov 22 11:00:00 -0500 2007
>
> Still kind of a shame there isn't just a 'holidays' gem.
>
> -Mat
>
>


--
My free Ruby e-book:
http://www.humblelittlerubybook...

My blogs:
http://www.mrneigh...
http://www.rubyinpra...

Daniel Berger

1/2/2007 7:04:00 PM

0


Bira wrote:
> On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:
> > Hi all,
> >
> > Well, it took seven years, but I've finally been annoyed enough by
> > reports failing on national holidays to say something. Report writers
> > know the routine:
>
> <...>
>
> The best way I know of checking for holidays is somehow keeping a
> record of which dates are holidays in a given year. It can be a
> database table, or some sort of configuration files when that isn't
> possible.
>
> This record would have to be mantained manually, but it would be just
> a simple case of editing the table/file every time you buy a new
> calendar :).

For fixed holidays, sure - I think that's what Date::Calc does (i.e.
read an external file in, base on the selected country). But for
floating holidays I would prefer a general algorithm. Surely someone
can come up with a general algorithm for "3rd Thursday in November",
etc. I'll bet the Rails folks already have something, but I haven't
looked.

Regards,

Dan

Kenosis

1/2/2007 7:15:00 PM

0


Daniel Berger wrote:
> Bira wrote:
> > On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:
> > > Hi all,
> > >
> > > Well, it took seven years, but I've finally been annoyed enough by
> > > reports failing on national holidays to say something. Report writers
> > > know the routine:
> >
> > <...>
> >
> > The best way I know of checking for holidays is somehow keeping a
> > record of which dates are holidays in a given year. It can be a
> > database table, or some sort of configuration files when that isn't
> > possible.
> >
> > This record would have to be mantained manually, but it would be just
> > a simple case of editing the table/file every time you buy a new
> > calendar :).
>
> For fixed holidays, sure - I think that's what Date::Calc does (i.e.
> read an external file in, base on the selected country). But for
> floating holidays I would prefer a general algorithm. Surely someone
> can come up with a general algorithm for "3rd Thursday in November",
> etc. I'll bet the Rails folks already have something, but I haven't
> looked.
>
> Regards,
>
> Dan
And whatever solution, it needs to be dynamically updatable to account
for suddenly announced national "holidays", like today happens to be -
doh!

Ken

Jeremy McAnally

1/2/2007 7:37:00 PM

0

Well, the way I'm working it out is like AR's dynamic finders. It
will have a few groups of dates hardcoded (like national holidays and
such), but then you can give it new groups in the form hashes of
arrays of dates with named "work_holidays" or "surprise_offdays" and
then call the method like is_a_work_holiday? or is_a_surprise_offday?.
I'm still working on it...I'll post when I've got it done.

--Jeremy

On 1/2/07, Kenosis <kenosis@gmail.com> wrote:
>
> Daniel Berger wrote:
> > Bira wrote:
> > > On 1/2/07, Daniel Berger <djberg96@gmail.com> wrote:
> > > > Hi all,
> > > >
> > > > Well, it took seven years, but I've finally been annoyed enough by
> > > > reports failing on national holidays to say something. Report writers
> > > > know the routine:
> > >
> > > <...>
> > >
> > > The best way I know of checking for holidays is somehow keeping a
> > > record of which dates are holidays in a given year. It can be a
> > > database table, or some sort of configuration files when that isn't
> > > possible.
> > >
> > > This record would have to be mantained manually, but it would be just
> > > a simple case of editing the table/file every time you buy a new
> > > calendar :).
> >
> > For fixed holidays, sure - I think that's what Date::Calc does (i.e.
> > read an external file in, base on the selected country). But for
> > floating holidays I would prefer a general algorithm. Surely someone
> > can come up with a general algorithm for "3rd Thursday in November",
> > etc. I'll bet the Rails folks already have something, but I haven't
> > looked.
> >
> > Regards,
> >
> > Dan
> And whatever solution, it needs to be dynamically updatable to account
> for suddenly announced national "holidays", like today happens to be -
> doh!
>
> Ken
>
>
>


--
My free Ruby e-book:
http://www.humblelittlerubybook...

My blogs:
http://www.mrneigh...
http://www.rubyinpra...