Skip to content

Commit

Permalink
perl/Git.pm: fix get_tz_offset to properly handle DST boundary cases
Browse files Browse the repository at this point in the history
When passed a local time that was on the boundary of a DST change,
get_tz_offset returned a GMT offset that was incorrect (off by one
hour).  This is because the time was converted to GMT and then back to
a time stamp via timelocal() which cannot disambiguate boundary cases
as noted in its documentation.

Modify this algorithm, using an approach suggested in

  http://article.gmane.org/gmane.comp.version-control.git/213871

to first convert the timestamp in question to two broken down forms
with localtime() and gmtime(), and then compute what timestamps
these two broken down forms would represent in GMT (i.e. a timezone
that does not have DST issues) by applying timegm() on them.  The
difference between the resulting timestamps is the timezone offset.

This avoids the ambigious conversion and allows a correct time to be
returned on every occassion.

Signed-off-by: Ben Walton <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
bdwalton authored and gitster committed Feb 9, 2013
1 parent 68868ff commit 75f7b5d
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions perl/Git.pm
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ use Error qw(:try);
use Cwd qw(abs_path cwd);
use IPC::Open2 qw(open2);
use Fcntl qw(SEEK_SET SEEK_CUR);
use Time::Local qw(timelocal);
use Time::Local qw(timegm);
}


Expand Down Expand Up @@ -528,8 +528,8 @@ If TIME is not supplied, the current local time is used.
sub get_tz_offset {
# some systmes don't handle or mishandle %z, so be creative.
my $t = shift || time;
my $gm = timelocal(gmtime($t));
my $sign = qw( + + - )[ $t <=> $gm ];
my $gm = timegm(localtime($t));
my $sign = qw( + + - )[ $gm <=> $t ];
return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
}

Expand Down

0 comments on commit 75f7b5d

Please sign in to comment.