SPUG: Date::Manip infinite loop

Joel Grow joel at largest.org
Sun Jan 13 09:45:51 PST 2013


Thanks for all the replies!  I hadn't considered daylight saving time, 
but that does seem to be the culprit.

The version of Date::Manip that "works" for me (ie, no infinite loop) 
is 5.44.  The version that triggers the infinite loop is 6.24.  I just 
installed the latest Date::Manip (6.38) and it still triggers the 
infinite loop.

What's your recommendation to solve this? I simply want to iterate 
through N sequential days of a calendar (eg, 90 consecutive days, 
starting March 17).

I see 2 quickie ways to solve it, below. But my sleepy mind is probably 
not thinking through this that well this morning. :-)

Joel

#---  V1  ----
use strict;
use Date::Manip;

my $current_date = '2012/01/01 08:00';

while (Date_Cmp($current_date, '2012/12/31 08:00')) {
     print "Current date is: $current_date\n";

     $current_date =
          UnixDate(DateCalc($current_date, "+1 days"), "%Y/%m/%d 
%H:%M");
}

print "Bye!\n";

#---  V2  ----
use strict;
use Date::Manip;

my $current_date = '2012/01/01';

while (Date_Cmp($current_date, '2012/12/31')) {
     print "Current date is: $current_date\n";

     my $next_date =
         UnixDate(DateCalc($current_date, "+1 days"), "%Y/%m/%d");

     if ($next_date eq $current_date) {
         $next_date =
             UnixDate(DateCalc($current_date, "+2 days"), "%Y/%m/%d");
     }

     $current_date = $next_date;
}

print "Bye!\n";

#---  End  ---

On 13.01.2013 06:07, Charles DeRykus wrote:

> On Sat, Jan 12, 2013 at 8:21 PM, Ronald J Kimball 
> <rjk-spug at tamias.net> wrote:
>> On Sat, Jan 12, 2013 at 02:36:35PM -0800, Joel Grow wrote:
>>> Hello SPUG gurus,
>>>
>>> I'm stumped as to why the code below gets into an infinite loop on
>>> November 4, 2012.  I tried starting $current_date at Jan 1, 2011, 
>>> and it
>>> gets into an infinite loop on November 6, 2011. This is on a linux 
>>> box
>>> running perl 5.10.1.  When I run it on another linux box running 
>>> 5.8.8,
>>> it works fine. Any idea what's going on? Thanks!
>>
>> Daylight Saving Time ended on November 4 in 2012, and on November 6 
>> in
>> 2011.  Somehow Date::Manip is not handling this correctly when 
>> adding a
>> day.
>>
>
> s/ correctly /in a DWIM-ish way/.  I think the gist is that
> Date::Manip's definition of 24 hrs="1 day" may produce a
> daylight savings surprise as happens here. A similar thing
> would happen if you just bump up the year to add "1 year"
> if the current date happens  to be Feb 29. Both cases need
> a bit of  DWIM magic.
>
> Date::Manip's author discusses the issue in depth here
> and mentions his intent to add some more DWIMery
> (which may have already happened)
>
>
> http://www.perlmonks.org/?node_id=936850.



More information about the spug-list mailing list