I accidentally came across a source for the minix gmtime function. I was interested in a bit that counted a year from the days from the era. Here is the courage of this bit:
http://www.raspberryginger.com/jbailey/minix/html/gmtime_8c-source.html
http://www.raspberryginger.com/jbailey/minix/html/loc__time_8h-source.html
#define EPOCH_YR 1970 #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400))) #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365) int year = EPOCH_YR; while (dayno >= YEARSIZE(year)) { dayno -= YEARSIZE(year); year++; }
It seems that the algorithm is O (n), where n is the distance from the era. In addition, it seems that LEAPYEAR should be calculated separately for each year; dozens of times for current dates and much more for dates far in the future. I had the following algorithm to do the same (in this case, from the ISO-9601 era (year 0 = 1 BC), and not from the UNIX era):
#define CYCLE_1 365 #define CYCLE_4 (CYCLE_1 * 4 + 1) #define CYCLE_100 (CYCLE_4 * 25 - 1) #define CYCLE_400 (CYCLE_100 * 4 + 1) year += 400 * (dayno / CYCLE_400) dayno = dayno % CYCLE_400 year += 100 * (dayno / CYCLE_100) dayno = dayno % CYCLE_100 year += 4 * (dayno / CYCLE_4) dayno = dayno % CYCLE_4 year += 1 * (dayno / CYCLE_1) dayno = dayno % CYCLE_1
This is done in O (1) for any date and looks as if it should be faster even for dates close to 1970.
So, assuming the Minix developers are smart people who did it for the mind and probably know a little more about C than I do, why?
c time
Thom smith
source share