perl/Git.pm: fix get_tz_offset to properly handle DST boundary cases
authorBen Walton <bdwalton@gmail.com>
Sat, 9 Feb 2013 21:46:57 +0000 (21:46 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 9 Feb 2013 22:34:18 +0000 (14:34 -0800)
commit75f7b5dfc47a9c764207559934b1c550423a243a
tree41db96b6cb984dd374666fb31cff3b363ae12a83
parent68868ff57348b7ae351890b3599949422d2e6001
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>
perl/Git.pm