I searched around a little bit and it seems that most bug reports for
DateTime::Set have to do with the from_recurrence method or misunderstandings
thereof. So it is entirely possible that the problem I am about to describe is
not a bug but a intricacy of handling Daylight savings in recurrence sets.
First off I am using the perl-DateTime-0.2901-1.2.el4.rf and
perl-DateTime-Set-0.25-2.2.el4.rf RPM's from RPMForge. I am running perl 5.8.8
(perl-5.8.8-4.el4s1) on CentOS 4.5 (Linux hostname.domain.com
2.6.9-55.0.12.ELsmp #1 SMP Fri Nov 2 11:19:08 EDT 2007 i686 i686 i386 GNU/Linux).
The Code:
--
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
use DateTime::Set;
use DateTime::Format::MySQL;
# The reason for the truncate's is because usually I am not
# specifying year and month I am simply doing now().
my $dt1 = DateTime->new(year => 2007, month =>
11)->set_time_zone('EST5EDT')->truncate(to => 'month');
my $dt2 = DateTime->new(year => 2007, month => 11, day =>
5)->set_time_zone('EST5EDT')->truncate(to => 'day');
# This was adapted from an example on the DateTime::Set doc page
my $dtset = DateTime::Set->from_recurrence(
start => $dt1,
end => $dt2,
recurrence => sub {
return $_[0]->truncate( to => 'day' )->add( days => 1 );
},
);
my $itr1 = $dtset->iterator;
while (my $dt3 = $itr1->next())
{
print DateTime::Format::MySQL->format_date($dt3) . "\n";
}
--
Output:
2007-11-01
2007-11-02
2007-11-03
2007-11-04
2007-11-04
2007-11-04
2007-11-04
.... etc
When I run the previous code it iterates as you would expect to '2007-11-04'
then repeatedly prints out '2007-11-04'. I think this has to do with daylight
savings time. Nov 4th effectively has 25 hours in it so adding 24 hours (1 day)
will leave you still in Nov 4th. I fixed this by adding "hours => 26" instead of
"days => 1" and then doing a truncate( to => 'day' ). I don't really like that,
but If this is the intended behavior I will live with it.
Thanks.