| /* 19950925 */ |
| #include "datetime.h" |
| |
| void datetime_tai(struct datetime *dt,datetime_sec t) |
| { |
| int day; |
| int tod; |
| int year; |
| int yday; |
| int wday; |
| int mon; |
| |
| tod = t % 86400; |
| day = t / 86400; |
| if (tod < 0) { tod += 86400; --day; } |
| |
| dt->hour = tod / 3600; |
| tod %= 3600; |
| dt->min = tod / 60; |
| dt->sec = tod % 60; |
| |
| wday = (day + 4) % 7; if (wday < 0) wday += 7; |
| dt->wday = wday; |
| |
| day -= 11017; |
| /* day 0 is march 1, 2000 */ |
| year = 5 + day / 146097; |
| day = day % 146097; if (day < 0) { day += 146097; --year; } |
| /* from now on, day is nonnegative */ |
| year *= 4; |
| if (day == 146096) { year += 3; day = 36524; } |
| else { year += day / 36524; day %= 36524; } |
| year *= 25; |
| year += day / 1461; |
| day %= 1461; |
| year *= 4; |
| yday = (day < 306); |
| if (day == 1460) { year += 3; day = 365; } |
| else { year += day / 365; day %= 365; } |
| yday += day; |
| |
| day *= 10; |
| mon = (day + 5) / 306; |
| day = day + 5 - 306 * mon; |
| day /= 10; |
| if (mon >= 10) { yday -= 306; ++year; mon -= 10; } |
| else { yday += 59; mon += 2; } |
| |
| dt->yday = yday; |
| dt->year = year - 1900; |
| dt->mon = mon; |
| dt->mday = day + 1; |
| } |