(svn r7731) -Fix (r5999): off-by-one error in the date to YMD calculation for first 4 years of a century that was not divisable by 400.
authorrubidium
Mon, 01 Jan 2007 22:00:54 +0000
changeset 5713 961b83d28033
parent 5712 1cf8721b1882
child 5714 e41584dbb1de
(svn r7731) -Fix (r5999): off-by-one error in the date to YMD calculation for first 4 years of a century that was not divisable by 400.
date.c
--- a/date.c	Mon Jan 01 19:37:53 2007 +0000
+++ b/date.c	Mon Jan 01 22:00:54 2007 +0000
@@ -92,9 +92,22 @@
 	int rem = date % (365 * 400 + 97);
 	uint16 x;
 
-	/* There are 24 leap years in 100 years */
-	yr += 100 * (rem / (365 * 100 + 24));
-	rem = rem % (365 * 100 + 24);
+	if (rem >= 365 * 100 + 25) {
+		/* There are 25 leap years in the first 100 years after
+		 * every 400th year, as every 400th year is a leap year */
+		yr  += 100;
+		rem -= 365 * 100 + 25;
+
+		/* There are 24 leap years in the next couple of 100 years */
+		yr += 100 * (rem / (365 * 100 + 24));
+		rem = (rem % (365 * 100 + 24));
+	}
+
+	if (!IsLeapYear(yr) && rem >= 365 * 4) {
+		/* The first 4 year of the century are not always a leap year */
+		yr  += 4;
+		rem -= 365 * 4;
+	}
 
 	/* There is 1 leap year every 4 years */
 	yr += 4 * (rem / (365 * 4 + 1));