Hello, all!

We're seeing what appears to be a Daylight Saving Time related bug. But maybe instead we're asking DateTime to do something unreasonable? (I've been following the discussion between Matthew and Zefram, but I think this is a different issue.)

Below is a small Perl program that demonstrates the problem. The program constructs a "daily at 23:00" recurrence, and then prints the first four occurrences in it. (In case it matters, we're running this on a Linux machine whose kernel has been updated for the new Daylight Saving Time change dates in the USA.)

Question #1:  Run the program.  This is the output:

Occurrence #1:  2007-03-10T23:00:00 America/Chicago CST (1173589200)
Occurrence #2:  2007-03-12T23:00:00 America/Chicago CDT (1173758400)
Occurrence #3:  2007-03-13T23:00:00 America/Chicago CDT (1173844800)
Occurrence #4:  2007-03-14T23:00:00 America/Chicago CDT (1173931200)

Why did it skip 2007-03-11? That was the day when CST became CDT, but why would that cause it to skip that day altogether?

===

Question #2: In the line near the top that assigns $rfc_time, change the 23 to some lower number, such as 14. In other words, change the start time of the recurrence from 23:00 to 14:00. Run the program. This is the output:

Occurrence #1:  2007-03-10T14:00:00 America/Chicago CST (1173556800)
Occurrence #2:  2007-03-11T15:00:00 America/Chicago CDT (1173643200)
Occurrence #3:  2007-03-12T14:00:00 America/Chicago CDT (1173726000)
Occurrence #4:  2007-03-13T14:00:00 America/Chicago CDT (1173812400)

Why does it show a different time on 2007-03-11 than on the other days? I think it should say 14:00 CDT, right? But even if 15:00 is correct for some reason, then why isn't 15:00 also correct for all of the days after that?

Thank you for any help!

Tim
Dallas, Texas, USA

==============

#!/usr/bin/perl

use DateTime;
use DateTime::Format::ICal;


$rfc_time = '20070310T230000';

# Create a start datetime.
$start = DateTime::Format::ICal->parse_datetime($rfc_time);
$start->set_time_zone('America/Chicago');


# Create a datetime set with a recurrence of "daily", starting at the
# datetime we created above.
$set = DateTime::Format::ICal->parse_recurrence(
                                  dtstart => $start,
                                  recurrence => 'FREQ=DAILY;INTERVAL=1');


# Show the first few occurrences in that datetime set.
for ($i=1; $i <= 4; ++$i) {

        $occurrence = $set->next;

        print "Occurrence #$i:  ", $occurrence,
                  " ", $occurrence->time_zone->name,
                  " ", $occurrence->time_zone_short_name,
                  " (", $occurrence->epoch, ")\n";

}





Reply via email to