git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH (BUGFIX) v2] gitweb: Fix handling of fractional timezones in parse_date

From
Jakub Narebski <jnareb@gmail.com>
Date
Mar 25, 2011, 16:50 UTC
Message-ID
<201103251750.56375.jnareb@gmail.com>
In-Reply-To
<AANLkTik5bLaR_0uhqGrNWW6U7z82KfmpNTyvRwkKFfj+@mail.gmail.com>
On Fri, 25 Mar 2011, Kevin Cernekee wrote:
Show 14 quoted lines
> 2011/3/25 Jakub Narebski <jnareb@gmail.com>:
> > @@ -2921,8 +2921,10 @@ sub parse_date {
> >        $date{'iso-8601'}  = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ",
> >                             1900+$year, 1+$mon, $mday, $hour ,$min, $sec;
> >
> > -       $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/;
> > -       my $local = $epoch + ((int $1 + ($2/60)) * 3600);
> > +       my ($tz_sign, $tz_hour, $tz_min) =
> > +               ($tz =~ m/^([+\-])([0-9][0-9])([0-9][0-9])$/);
> 
> It's just a matter of personal preference, but I would find this
> regexp slightly easier to read:
> 
> +               ($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/);
I went for minimal changes, same as with the change below.
Show 6 quoted lines
> > +       $tz_sign = ($tz_sign eq '-' ? -1 : +1);
> > +       my $local = $epoch + $tz_sign*($tz_hour + ($tz_min/60.0))*3600;
> 
> If you wanted to avoid floats, you could do something like:
> 
> +       my $local = $epoch + $tz_sign * ($tz_hour * 3600 + $tz_min * 60);

Note that because valid $tz_min can be only 00, 30 or 45, see e.g. http://en.wikipedia.org/wiki/List_of_time_zones_by_UTC_offset therefore version using floats would not introduce any rounding errors: 0, 0.5 and 0.75 can be represented exactly as 2-base float.

Anyway below is patch with above changes:
-- >8 --
Subject: [PATCH] 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>
---
 gitweb/gitweb.perl |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 0178633..7b9f90b 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -2921,8 +2921,10 @@ sub parse_date {
 	$date{'iso-8601'}  = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ",
 	                     1900+$year, 1+$mon, $mday, $hour ,$min, $sec;
 
-	$tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/;
-	my $local = $epoch + ((int $1 + ($2/60)) * 3600);
+	my ($tz_sign, $tz_hour, $tz_min) =
+		($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/);
+	$tz_sign = ($tz_sign eq '-' ? -1 : +1);
+	my $local = $epoch + $tz_sign*($tz_hour*3600 + $tz_min*60);
 	($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($local);
 	$date{'hour_local'} = $hour;
 	$date{'minute_local'} = $min;
-- 
1.7.3
Previous: Kevin CernekeeNext: Junio C Hamano
Message 30 of 36 in “gitweb: rename parse_date() to format_date()”
  1. 1/2 gitweb: rename parse_date() to format_date()Kevin Cernekee, Mar 19, 2011
  2. 2/2 gitweb: introduce localtime featureKevin Cernekee, Mar 19, 2011
  3. Jakub NarebskiMar 19, 2011
  4. Junio C HamanoMar 19, 2011
  5. Kevin CernekeeMar 19, 2011
  6. Jakub NarebskiMar 19, 2011
  7. Kevin CernekeeMar 19, 2011
  8. Jakub NarebskiMar 19, 2011
  9. J.H.Mar 20, 2011
  10. Kevin CernekeeMar 20, 2011
  11. Jakub NarebskiMar 21, 2011
  12. J.H.Mar 21, 2011
  13. Jakub NarebskiMar 21, 2011
  14. Piotr KrukowieckiMar 21, 2011
  15. J.H.Mar 21, 2011
  16. Jakub NarebskiMar 21, 2011
  17. 0/1 Gitweb: Change timezoneJohn 'Warthog9' Hawley, Mar 24, 2011
  18. 1/1 gitweb: javascript ability to adjust time based on timezoneJohn 'Warthog9' Hawley, Mar 24, 2011
  19. Kevin CernekeeMar 24, 2011
  20. J.H.Mar 24, 2011
  21. Jakub NarebskiMar 24, 2011
  22. Jakub NarebskiMar 24, 2011
  23. Kevin CernekeeMar 24, 2011
  24. J.H.Mar 24, 2011
  25. J.H.Mar 24, 2011
  26. Jakub NarebskiMar 24, 2011
  27. Jakub NarebskiMar 24, 2011
  28. gitweb: Fix handling of fractional timezones in parse_dateJakub Narebski, Mar 25, 2011
  29. Kevin CernekeeMar 25, 2011
  30. gitweb: Fix handling of fractional timezones in parse_dateJakub Narebski, Mar 25, 2011
  31. Junio C HamanoMar 25, 2011
  32. Jakub NarebskiMar 25, 2011
  33. gitweb: Fix handling of fractional timezones in parse_dateJakub Narebski, Mar 25, 2011
  34. Jakub NarebskiMar 19, 2011
  35. Jon SeymourMar 19, 2011
  36. Junio C HamanoMar 19, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.