All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Narebski <jnareb@gmail.com>
To: Kevin Cernekee <cernekee@gmail.com>
Cc: "John 'Warthog9' Hawley" <warthog9@eaglescrag.net>,
	git@vger.kernel.org, Junio Hamano <gitster@pobox.com>
Subject: [PATCH (BUGFIX) v2] gitweb: Fix handling of fractional timezones in parse_date
Date: Fri, 25 Mar 2011 17:50:54 +0100	[thread overview]
Message-ID: <201103251750.56375.jnareb@gmail.com> (raw)
In-Reply-To: <AANLkTik5bLaR_0uhqGrNWW6U7z82KfmpNTyvRwkKFfj+@mail.gmail.com>

On Fri, 25 Mar 2011, Kevin Cernekee wrote:
> 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.

> > +       $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

  reply	other threads:[~2011-03-25 16:51 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-19  5:39 [PATCH 1/2] gitweb: rename parse_date() to format_date() Kevin Cernekee
2011-03-19  5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee
2011-03-19 15:18   ` Jakub Narebski
2011-03-19 17:56   ` Junio C Hamano
2011-03-19 19:49     ` Kevin Cernekee
2011-03-19 21:09       ` Jakub Narebski
2011-03-19 21:22         ` Kevin Cernekee
2011-03-19 21:41           ` Jakub Narebski
2011-03-20 22:38   ` J.H.
2011-03-20 23:44     ` Kevin Cernekee
2011-03-21  0:20     ` Jakub Narebski
2011-03-21  2:35       ` J.H.
2011-03-21 16:01         ` Jakub Narebski
2011-03-21 18:39           ` Piotr Krukowiecki
2011-03-21 18:39           ` J.H.
2011-03-21 22:20             ` Jakub Narebski
2011-03-24  0:08   ` [PATCH 0/1] Gitweb: Change timezone John 'Warthog9' Hawley
2011-03-24  0:08   ` [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone John 'Warthog9' Hawley
2011-03-24  5:23     ` Kevin Cernekee
2011-03-24  7:21       ` J.H.
2011-03-24 21:23         ` Jakub Narebski
2011-03-24 20:19       ` Jakub Narebski
2011-03-24 22:00         ` Kevin Cernekee
2011-03-24 22:29           ` J.H.
2011-03-24 23:04         ` J.H.
2011-03-24 23:36           ` Jakub Narebski
2011-03-24 15:17     ` Jakub Narebski
2011-03-25 15:20       ` [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date Jakub Narebski
2011-03-25 16:26         ` Kevin Cernekee
2011-03-25 16:50           ` Jakub Narebski [this message]
2011-03-25 17:15           ` Junio C Hamano
2011-03-25 17:47             ` Jakub Narebski
2011-03-25 19:20             ` [PATCH (BUGFIX) v3] " Jakub Narebski
2011-03-19 10:33 ` [PATCH 1/2] gitweb: rename parse_date() to format_date() Jakub Narebski
2011-03-19 11:50   ` Jon Seymour
2011-03-19 18:00 ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201103251750.56375.jnareb@gmail.com \
    --to=jnareb@gmail.com \
    --cc=cernekee@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=warthog9@eaglescrag.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.