Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

gitweb: Fix handling of fractional timezones in parse_date

Fractional timezones, like -0330 (NST used in Canada) or +0430
(Afghanistan, Iran DST), were not handled properly in parse_date; this
means values such as 'minute_local' and 'iso-tz' were not generated
correctly.

This was caused by two mistakes:

* sign of timezone was applied only to hour part of offset, and not
  as it should be also to minutes part (this affected only negative
  fractional timezones).

* 'int $h + $m/60' is 'int($h + $m/60)' and not 'int($h) + $m/60',
  so fractional part was discarded altogether ($h is hours, $m is
  minutes, which is always less than 60).

Note that positive fractional timezones +0430, +0530 and +1030 can be
found as authortime in git.git repository itself.

For example http://repo.or.cz/w/git.git/commit/88d50e7 had authortime
of "Fri, 8 Jan 2010 18:48:07 +0000 (23:48 +0530)", which is not marked
with 'atnight', when "git show 88d50e7" gives correct author date of
"Sat Jan 9 00:18:07 2010 +0530".

Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information...
commit 2b1e17237b0b14855ad8337ec001d6d1fd7cca61 1 parent b5f306f
Jakub Narębski authored March 25, 2011 gitster committed March 25, 2011

Showing 1 changed file with 4 additions and 2 deletions. Show diff stats Hide diff stats

  1. 6  gitweb/gitweb.perl
6  gitweb/gitweb.perl
@@ -2913,8 +2913,10 @@ sub parse_date {
2913 2913
 	$date{'iso-8601'}  = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ",
2914 2914
 	                     1900+$year, 1+$mon, $mday, $hour ,$min, $sec;
2915 2915
 
2916  
-	$tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/;
2917  
-	my $local = $epoch + ((int $1 + ($2/60)) * 3600);
  2916
+	my ($tz_sign, $tz_hour, $tz_min) =
  2917
+		($tz =~ m/^([-+])(\d\d)(\d\d)$/);
  2918
+	$tz_sign = ($tz_sign eq '-' ? -1 : +1);
  2919
+	my $local = $epoch + $tz_sign*((($tz_hour*60) + $tz_min)*60);
2918 2920
 	($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($local);
2919 2921
 	$date{'hour_local'} = $hour;
2920 2922
 	$date{'minute_local'} = $min;

0 notes on commit 2b1e172

Please sign in to comment.
Something went wrong with that request. Please try again.