Code

date: avoid "X years, 12 months" in relative dates
authorMichael J Gruber <git@drmicha.warpmail.net>
Wed, 20 Apr 2011 09:12:11 +0000 (11:12 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 21 Apr 2011 02:23:16 +0000 (19:23 -0700)
commitf1e9c548ce45005521892af0299696204ece286b
tree6387f371b2dcb5c837325b661aa04322d5c5863f
parent87b50542a08ac6caa083ddc376e674424e37940a
date: avoid "X years, 12 months" in relative dates

When relative dates are more than about a year ago, we start
writing them as "Y years, M months".  At the point where we
calculate Y and M, we have the time delta specified as a
number of days. We calculate these integers as:

  Y = days / 365
  M = (days % 365 + 15) / 30

This rounds days in the latter half of a month up to the
nearest month, so that day 16 is "1 month" (or day 381 is "1
year, 1 month").

We don't round the year at all, though, meaning we can end
up with "1 year, 12 months", which is silly; it should just
be "2 years".

Implement this differently with months of size

  onemonth = 365/12

so that

  totalmonths = (long)( (days + onemonth/2)/onemonth )
  years = totalmonths / 12
  months = totalmonths % 12

In order to do this without floats, we write the first formula as

  totalmonths = (days*12*2 + 365) / (365*2)

Tests and inspiration by Jeff King.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
date.c
t/t0006-date.sh