summaryrefslogtreecommitdiff
path: root/perl
diff options
context:
space:
mode:
authorBen Walton <bdwalton@gmail.com>2013-02-09 21:46:57 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-02-09 22:34:18 (GMT)
commit75f7b5dfc47a9c764207559934b1c550423a243a (patch)
tree41db96b6cb984dd374666fb31cff3b363ae12a83 /perl
parent68868ff57348b7ae351890b3599949422d2e6001 (diff)
downloadgit-75f7b5dfc47a9c764207559934b1c550423a243a.zip
git-75f7b5dfc47a9c764207559934b1c550423a243a.tar.gz
git-75f7b5dfc47a9c764207559934b1c550423a243a.tar.bz2
perl/Git.pm: fix get_tz_offset to properly handle DST boundary cases
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 <bdwalton@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'perl')
-rw-r--r--perl/Git.pm6
1 files changed, 3 insertions, 3 deletions
diff --git a/perl/Git.pm b/perl/Git.pm
index 5649bcc..a56d1e7 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -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);
}
@@ -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]);
}