/* * compute seconds since Jan 1 1970 */ static ulong rtc2sec(Rtc *rtc) { ulong secs; int i; int *d2m; secs = 0; /* * seconds per year */ for(i = 1970; i < rtc->year; i++){ d2m = yrsize(i); secs += d2m[0] * SEC2DAY; } /* * seconds per month */ d2m = yrsize(rtc->year); for(i = 1; i < rtc->mon; i++) secs += d2m[i] * SEC2DAY; secs += (rtc->mday-1) * SEC2DAY; secs += rtc->hour * SEC2HOUR; secs += rtc->min * SEC2MIN; secs += rtc->sec; return secs; }
/* * compute seconds since Jan 1 1970 GMT * and convert to our timezone. */ long tm2sec(Tm *tm) { long secs; int i, yday, year, *d2m; if(strcmp(tm->zone, "GMT") != 0 && timezone.stname[0] == 0) readtimezone(); secs = 0; /* * seconds per year */ year = tm->year + 1900; for(i = 1970; i < year; i++){ d2m = yrsize(i); secs += d2m[0] * SEC2DAY; } /* * if mday is set, use mon and mday to compute yday */ if(tm->mday){ yday = 0; d2m = yrsize(year); for(i=0; i<tm->mon; i++) yday += d2m[i+1]; yday += tm->mday-1; }else{ yday = tm->yday; } secs += yday * SEC2DAY; /* * hours, minutes, seconds */ secs += tm->hour * SEC2HOUR; secs += tm->min * SEC2MIN; secs += tm->sec; /* * Only handles zones mentioned in /env/timezone, * but things get too ambiguous otherwise. */ if(strcmp(tm->zone, timezone.stname) == 0) secs -= timezone.stdiff; else if(strcmp(tm->zone, timezone.dlname) == 0) secs -= timezone.dldiff; if(secs < 0) secs = 0; return secs; }
/* * compute rtc from seconds since Jan 1 1970 */ static void sec2rtc(ulong secs, Rtc *rtc) { int d; long hms, day; int *d2m; /* * break initial number into days */ hms = secs % SEC2DAY; day = secs / SEC2DAY; if(hms < 0) { hms += SEC2DAY; day -= 1; } /* * generate hours:minutes:seconds */ rtc->sec = hms % 60; d = hms / 60; rtc->min = d % 60; d /= 60; rtc->hour = d; /* * year number */ if(day >= 0) for(d = 1970; day >= *yrsize(d); d++) day -= *yrsize(d); else for (d = 1970; day < 0; d--) day += *yrsize(d-1); rtc->year = d; /* * generate month */ d2m = yrsize(rtc->year); for(d = 1; day >= d2m[d]; d++) day -= d2m[d]; rtc->mday = day + 1; rtc->mon = d; return; }
/* * compute seconds since Jan 1 1970 */ static long lusertime(char *argbuf) { char *buf; ulong secs; int i, y, m; int *d2m; buf = argbuf; i = strlen(buf); if(i != 10 && i != 12) return -1; secs = 0; y = g2(&buf); m = g2(&buf); if(y < 70) y += 2000; else y += 1900; /* * seconds per year */ for(i = 1970; i < y; i++){ d2m = yrsize(i); secs += d2m[0] * SEC2DAY; } /* * seconds per month */ d2m = yrsize(y); for(i = 1; i < m; i++) secs += d2m[i] * SEC2DAY; secs += (g2(&buf)-1) * SEC2DAY; secs += g2(&buf) * SEC2HOUR; secs += g2(&buf) * SEC2MIN; if(*buf) secs += g2(&buf); sprint(argbuf, "%ld", secs); return secs; }
static long tm2sec(SYSTEMTIME *tm) { long secs; int i, *d2m; secs = 0; /* * seconds per year */ for(i = 1970; i < tm->wYear; i++){ d2m = yrsize(i); secs += d2m[0] * SEC2DAY; } /* * seconds per month */ d2m = yrsize(tm->wYear); for(i = 1; i < tm->wMonth; i++) secs += d2m[i] * SEC2DAY; /* * secs in last month */ secs += (tm->wDay-1) * SEC2DAY; /* * hours, minutes, seconds */ secs += tm->wHour * SEC2HOUR; secs += tm->wMinute * SEC2MIN; secs += tm->wSecond; return secs; }