date.c
changeset 5713 961b83d28033
parent 5249 b04b34842727
child 5720 cc0ceeafaa55
--- 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));