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