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

Re: Fix approxidate() to understand more extended numbers

From
Linus Torvalds <torvalds@osdl.org>
Date
Sep 29, 2006, 19:36 UTC
Message-ID
<Pine.LNX.4.64.0609291231560.3952@g5.osdl.org>
In-Reply-To
<7vslibno88.fsf@assigned-by-dhcp.cox.net>
On Fri, 29 Sep 2006, Junio C Hamano wrote:
Show 13 quoted lines
> Linus Torvalds <torvalds@osdl.org> writes:
> >
> > If you write
> >
> > 	12:30 am
> >
> > you really _should_ subtract 12, leaving you with 0:30. We don't. So we 
> > end up with a 24-hour time of 12:30, which is obviously _pm_, and wrong.
> >
> > And "12 am" or "12 pm" doesn't work at all.
> 
> Ah, that's what you meant.  My brain a bit too tired from the
> day job tonight X-<.
Here's a patch that should work. It just simplifies the whole thing to say 
	"hour = (hour % 12) + X"
where X is 12 for PM and 0 for AM.

It also fixes the "exact date" parsing, which didn't parse AM at all, and as such would do the same "12:30 AM" means "12:30 24-hour-format" bug. Of course, I hope that no exact dates use AM/PM anyway, but since we support the PM format, let's just get it right.

Not hugely tested, but I did test some of it, and it all _looks_ sane.
		Linus
---
diff --git a/date.c b/date.c
index db4c185..1825922 100644
--- a/date.c
+++ b/date.c
@@ -256,8 +256,12 @@ static int match_alpha(const char *date,
 	}
 
 	if (match_string(date, "PM") == 2) {
-		if (tm->tm_hour > 0 && tm->tm_hour < 12)
-			tm->tm_hour += 12;
+		tm->tm_hour = (tm->tm_hour % 12) + 12;
+		return 2;
+	}
+
+	if (match_string(date, "AM") == 2) {
+		tm->tm_hour = (tm->tm_hour % 12) + 0;
 		return 2;
 	}
 
@@ -600,28 +604,30 @@ static void date_tea(struct tm *tm, int 
 
 static void date_pm(struct tm *tm, int *num)
 {
-	int hour = *num;
+	int hour, n = *num;
 	*num = 0;
 
-	if (hour > 0 && hour < 12) {
-		tm->tm_hour = hour;
+	hour = tm->tm_hour;
+	if (n) {
+		hour = n;
 		tm->tm_min = 0;
 		tm->tm_sec = 0;
 	}
-	if (tm->tm_hour > 0 && tm->tm_hour < 12)
-		tm->tm_hour += 12;
+	tm->tm_hour = (hour % 12) + 12;
 }
 
 static void date_am(struct tm *tm, int *num)
 {
-	int hour = *num;
+	int hour, n = *num;
 	*num = 0;
 
-	if (hour > 0 && hour < 12) {
-		tm->tm_hour = hour;
+	hour = tm->tm_hour;
+	if (n) {
+		hour = n;
 		tm->tm_min = 0;
 		tm->tm_sec = 0;
 	}
+	tm->tm_hour = (hour % 12);
 }
 
 static const struct special {
Previous: Johannes Schindelin
Message 9 of 9 in “Clean up approxidate() in preparation for fixes”
  1. Linus TorvaldsSep 28, 2006
  2. Fix approxidate() to understand more extended numbersLinus Torvalds, Sep 28, 2006
  3. Morten WelinderSep 29, 2006
  4. Linus TorvaldsSep 29, 2006
  5. Junio C HamanoSep 29, 2006
  6. Linus TorvaldsSep 29, 2006
  7. Junio C HamanoSep 29, 2006
  8. Johannes SchindelinSep 29, 2006
  9. Linus TorvaldsSep 29, 2006

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.