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

[PATCH] date: avoid "X years, 12 months" in relative dates

From
Michael J Gruber <git@drmicha.warpmail.net>
Date
Apr 20, 2011, 09:12 UTC
Message-ID
<1d0633318ffc778dfcc1c32ecf80fca0327349d6.1303290693.git.git@drmicha.warpmail.net>
In-Reply-To
<20110420052435.GA28597@sigill.intra.peff.net>

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>
---
 date.c          |    5 +++--
 t/t0006-date.sh |    1 +
 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/date.c b/date.c
index 00f9eb5..cde239c 100644
--- a/date.c
+++ b/date.c
@@ -129,8 +129,9 @@ const char *show_date_relative(unsigned long time, int tz,
 	}
 	/* Give years and months for 5 years or so */
 	if (diff < 1825) {
-		unsigned long years = diff / 365;
-		unsigned long months = (diff % 365 + 15) / 30;
+		unsigned long totalmonths = (diff*12*2 + 365)/(365*2);
+		unsigned long years = totalmonths / 12;
+		unsigned long months = totalmonths % 12;
 		int n;
 		n = snprintf(timebuf, timebuf_size, "%lu year%s",
 				years, (years > 1 ? "s" : ""));
diff --git a/t/t0006-date.sh b/t/t0006-date.sh
index 1d4d0a5..f87abb5 100755
--- a/t/t0006-date.sh
+++ b/t/t0006-date.sh
@@ -25,6 +25,7 @@ check_show 37500000 '1 year, 2 months ago'
 check_show 55188000 '1 year, 9 months ago'
 check_show 630000000 '20 years ago'
 check_show 31449600 '12 months ago'
+check_show 62985600 '2 years ago'
 
 check_parse() {
 	echo "$1 -> $2" >expect
-- 
1.7.5.rc1.312.g1936c
Previous: Jeff KingNext: Jeff King
Message 2 of 4 in “date: avoid "X years, 12 months" in relative dates”
  1. date: avoid "X years, 12 months" in relative datesJeff King, Apr 20, 2011
  2. date: avoid "X years, 12 months" in relative datesMichael J Gruber, Apr 20, 2011
  3. Jeff KingApr 20, 2011
  4. Michael J GruberApr 20, 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.