5 ms·
I wouldn't be surprised if it was just a for loop checking for all the years in a range, whether they start on the same day of week, and are/are not leap years
by mxtopher 7y ago
I wouldn't be surprised if it was just a for loop checking for all the years in a range, whether they start on the same day of week, and are/are not leap years :)
- ivolimmen 7y agoOr the calculations where done once and now it's stored in a database.
- avaika 7y agoOnce and manually. On an oily napkin in canteen.
- jcranmer 7y agoThe calculations are actually really easy. Note that the length of a (regular) year is 1 mod 7, which means weekdays slip by 1 day each year, except for leap years. Over the 400-year Gregorian calendar cycle, there are 97 leap years, for a total of 497 days of slip... so adding 400 years to the current calendar year will always yield the same calendar. More specifically, there are 14 possible calendars. The leap year cycle is 4 days (excluding the 100 year skips), and the weekday cycle is 7 days, so the leap year×weekday cycle is 28 years. So the starting weekdays are on a 28-year cycle, but you have to slip your resulting calculation by the number of centuries from the beginning of the 400-year cycle (i.e., integer division of year by 100). You'll reuse a leap year calendar in 28 years (40 years, if it crosses a round-hundred year), and you'll reuse a non-leap year calendar in 6 or 11 years (12 or 6 years, if it cross a round-hundred year). The easiest way to code it is to just precompute the year % 400 table and report the results.
- lifthrasiir 7y ago> The easiest way to code it is to just precompute the year % 400 table and report the results. If you are interested, Chrono [1] internally uses the exact table. Constants there refer to dominical letters [2]. [1] https://github.com/chronotope/chrono/blob/a4488007272569f7529dc1bfe61d417d22391104/src/naive/internals.rs#L40-L69 https://github.com/chronotope/chrono/blob/a4488007272569f752... [2] https://en.wikipedia.org/wiki/Dominical_letter https://en.wikipedia.org/wiki/Dominical_letter
- ComputerGuru 7y ago> The leap year cycle is 4 days (excluding the 100 year skips) I think you mean “The leap year cycle is 4 days (excluding the 100 year skips, except every fourth 100 years when they don’t),” eg how 2000 was a leap year despite this individual rule. (I know it’s accounted for elsewhere in the modulo logic, but you shouldn’t resist the impulse to point out just how crazy it all is!)
- jcranmer 7y agoThe 400 year rule is already accounted for by taking the year mod 400. 2000, 2400, 2800, etc. will all use the same calendar.
- ComputerGuru 7y agoYes, I did mention you had it taken care of, just not explicitly pointed out :)