To whom it may concern, I have what I think is a simple couple methods for estimating delivery dates (We are a custom printing shop and build in padding to allow for acquire and printing then give the customer an estimate on how many days we can complete and ship):
sub calculateOrderDeliveryDate { my ($self, $orderDate, $serviceDays) = @_; warn Dumper("$orderDate --- $serviceDays"); my @workingDays = $self->_getWorkingDays($orderDate, max (25, $serviceDays)); # Optimize search to 25 days out... return $workingDays[$serviceDays]; } sub _getWorkingDays { my ($self, $startDate, $count) = @_; my $startDay = DateTime->from_object( object => $startDate )->truncate( to => 'day' ); my $iterator = DateTime::Event::Recurrence->weekly( days => [1..5] )->iterator( after => DateTime->from_object( object => $startDay ), ); my @result = (); while ($count > scalar @result) { my $date = $iterator->next; warn Dumper("$date -> "); if ($date && !isHoliday($date)) { push @result, $date; } } return \@result; } Which when called using (Local and server): perl -e "use DateTime; use Util::Dates; Util::Dates->calculateOrderDeliveryDate(DateTime->now(), 7);" Logs out: $VAR1 = '2016-02-10T17:51:31 --- 7'; $VAR1 = '2016-02-12T00:00:00 -> '; $VAR1 = '2016-02-15T00:00:00 -> '; $VAR1 = '2016-02-16T00:00:00 -> '; $VAR1 = '2016-02-17T00:00:00 -> '; $VAR1 = '2016-02-18T00:00:00 -> '; $VAR1 = '2016-02-19T00:00:00 -> '; $VAR1 = '2016-02-22T00:00:00 -> '; $VAR1 = '2016-02-23T00:00:00 -> '; $VAR1 = '2016-02-24T00:00:00 -> '; $VAR1 = '2016-02-25T00:00:00 -> '; $VAR1 = '2016-02-26T00:00:00 -> '; $VAR1 = '2016-02-29T00:00:00 -> '; $VAR1 = '2016-03-01T00:00:00 -> '; $VAR1 = '2016-03-02T00:00:00 -> '; $VAR1 = '2016-03-03T00:00:00 -> '; $VAR1 = '2016-03-04T00:00:00 -> '; $VAR1 = '2016-03-07T00:00:00 -> '; $VAR1 = '2016-03-08T00:00:00 -> '; $VAR1 = '2016-03-09T00:00:00 -> '; $VAR1 = '2016-03-10T00:00:00 -> '; $VAR1 = '2016-03-11T00:00:00 -> '; $VAR1 = '2016-03-14T00:00:00 -> '; $VAR1 = '2016-03-15T00:00:00 -> '; $VAR1 = '2016-03-16T00:00:00 -> '; $VAR1 = '2016-03-17T00:00:00 -> '; Which is what I want. When running the same code under an Apache web request on the server, the Apache error log file contains: [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-10T12:49:32 --- 7'; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-11T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-15T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-19T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-22T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-26T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-29T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-04T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-07T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-11T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-14T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-18T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-21T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-25T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-28T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-01T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-04T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-08T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-11T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-15T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-18T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-22T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-25T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-29T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-05-02T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-05-06T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-10T12:49:32 --- 21'; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-11T00:00:00 -> '; [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-13T00:00:00 -> '; [Wed Feb 10 12:49:33 2016] main.cgi: $VAR1 = '2016-02-20T00:00:00 -> '; [Wed Feb 10 12:49:33 2016] main.cgi: Can't call method "is_infinite" on an undefined value at /usr/local/share/perl/5.14.2/DateTime/Event/Recurrence.pm line 870. The initial call is for 7 day delivery estimate followed by a 21 day delivery estimate. Since both of these are under 21 days, they run the 25 day estimate (which I was Memoizing to save from calling it repeatedly...) The Error I think is inconsequential to the issue I'm concerned with. If you look at the dates logged out, it prints the Monday and Friday dates and I can't figure out why. On the second call, it logs out Friday then tries Sunday (which isn't in the recurrence range) followed by the next Sunday which then eventually fails. I've verified that the following packages are updated on the server (Ubuntu 12.04): DateTime is up to date. (1.21) DateTime::Event::Recurrence is up to date. (0.18) DateTime::Format::CLDR is up to date. (1.17) DateTime::Format::ICal is up to date. (0.09) DateTime::Set is up to date. (0.3600) The versions match my local copy. Server: Distributor ID: Ubuntu Description: Ubuntu 12.04.5 LTS Release: 12.04 Codename: precise Local: Distributor ID: Debian Description: Debian GNU/Linux testing-updates (sid) Release: testing-updates Codename: sid Perl: v5.14.2 (which I limited to match server version since 5.22 is on Debian Testing) Do you have any troubleshooting steps I can take to figure out why the iterator would only be stepping over Monday and Friday and skipping the Tues/Weds/Thur dates? (I've tried removing the range and using an array of [1. 2. 3. 4. 5] in the Recurrence to no avail) I had used the DateTime::Event::Holiday::US file previously to complement the weekday set I am generating and I went through removing all that to track down what this problem is. Nick