How I can I convert timezones in Perl?

jinanwow picture jinanwow · Feb 24, 2010 · Viewed 14.7k times · Source

I am trying to convert a date/time GMT 0 to GMT -6 in Perl.

For example, a DHCP Server lease time is in the following format:

2010/02/18 23:48:37

I am trying to convert that time to the Localtime zone (GMT -6) but need it to honor Daylight savings time.

The script below may be overkill, but I am not sure how to proceed from here. (Any suggestions would be awsome).

my $TIMESTART;

$TIMESTART = "2010/02/18 23:48:37";
$TIMESTART =~ s/\//-/g;

use DateTime;
use DateTime::TimeZone;

use DateTime::Format::MySQL;
my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART);

my $tz = DateTime::TimeZone->new( name => 'America/Chicago' );

print $tz->offset_for_datetime($dt) . "\n";

It will output the following lines:

2010-02-18T23:48:37
-21600

I need to be able to add -21600 to the date to get the local time zone of GMT -6 but I am not sure how to approch this.

Answer

Ivan Nevostruev picture Ivan Nevostruev · Feb 24, 2010

Call set_time_zone method 2 times:

my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART);
$dt->set_time_zone('UTC'); ## set timezone of parsed date time
$dt->set_time_zone('America/Chicago'); ## change timezone in safe way

print DateTime::Format::MySQL->format_datetime($dt),"\n"; ## check the result

How it works:

  • when you create DateTime object without time zone specified, "floating" time zone is set
  • first call of set_time_zone change time zone to UTC without conversion
  • second call of set_time_zone change UTC to America/Chicago