Matthew wrote:
>$dt->set_time_zone("US/Central");
>
>print "+9weeks CST: " . $dt->epoch . " - " . $dt->datetime . "\n";
This is wrong. "US/Central" doesn't refer to CST specifically. It refers
to the US central timezone *including DST switches*. The date it's
showing is in CDT, not CST. Try displaying $dt->time_zone_short_name
as well, which will show what's going on.
>Many of these events were created before the DST switch. How should I be
>calculating these event dates so that 4PM 2 weeks ago still shows as 4PM
>tomorrow?
Do the ->add with the timezone already set. Thus:
#!/usr/bin/perl
use DateTime;
my $dt = DateTime->from_epoch(epoch => 1168812000, time_zone => 'GMT');
print "Date in GMT: " . $dt->epoch . " - " . $dt->datetime . " " .
$dt->time_zone_short_name . "\n";
$dt->set_time_zone("US/Central");
print "Date in cen: " . $dt->epoch . " - " . $dt->datetime . " " .
$dt->time_zone_short_name . "\n";
$dt->add(weeks => 9);
print "+9weeks cen: " . $dt->epoch . " - " . $dt->datetime . " " .
$dt->time_zone_short_name . "\n";
$dt->set_time_zone("GMT");
print "+9weeks GMT: " . $dt->epoch . " - " . $dt->datetime . " " .
$dt->time_zone_short_name . "\n";
yields:
Date in GMT: 1168812000 - 2007-01-14T22:00:00 UTC
Date in cen: 1168812000 - 2007-01-14T16:00:00 CST
+9weeks cen: 1174251600 - 2007-03-18T16:00:00 CDT
+9weeks GMT: 1174251600 - 2007-03-18T21:00:00 UTC
-zefram