111 lines
1.9 KiB
C
111 lines
1.9 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
|
|
#include "zoneinfo.h"
|
|
|
|
#define SEC2MIN 60L
|
|
#define SEC2HOUR (60L*SEC2MIN)
|
|
#define SEC2DAY (24L*SEC2HOUR)
|
|
|
|
/*
|
|
* days per month plus days/year
|
|
*/
|
|
static int dmsize[] =
|
|
{
|
|
365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
|
};
|
|
static int ldmsize[] =
|
|
{
|
|
366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
|
};
|
|
|
|
/*
|
|
* return the days/month for the given year
|
|
*/
|
|
static int *
|
|
yrsize(int y)
|
|
{
|
|
if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0))
|
|
return ldmsize;
|
|
else
|
|
return dmsize;
|
|
}
|
|
|
|
/*
|
|
* compute seconds since Jan 1 1970 GMT
|
|
* and convert to our timezone.
|
|
*/
|
|
long
|
|
tm2sec(Tm *tm)
|
|
{
|
|
Tinfo ti0, ti1, *ti;
|
|
long secs;
|
|
int i, yday, year, *d2m;
|
|
|
|
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;
|
|
|
|
/*
|
|
* Assume the local time zone if zone is not GMT
|
|
*/
|
|
if(strcmp(tm->zone, "GMT") != 0) {
|
|
i = zonelookuptinfo(&ti0, secs);
|
|
ti = &ti0;
|
|
if (i != -1)
|
|
if (ti->tzoff!=0) {
|
|
/*
|
|
* to what local time period `secs' belongs?
|
|
*/
|
|
if (ti->tzoff>0) {
|
|
/*
|
|
* east of GMT; check previous local time transition
|
|
*/
|
|
if (ti->t+ti->tzoff > secs)
|
|
if (zonetinfo(&ti1, i-1)!=-1)
|
|
ti = &ti1;
|
|
} else
|
|
/*
|
|
* west of GMT; check next local time transition
|
|
*/
|
|
if (zonetinfo(&ti1, i+1))
|
|
if (ti1.t+ti->tzoff < secs)
|
|
ti = &ti1;
|
|
// fprint(2, "tt: %ld+%d %ld\n", (long)ti->t, ti->tzoff, (long)secs);
|
|
secs -= ti->tzoff;
|
|
}
|
|
}
|
|
|
|
if(secs < 0)
|
|
secs = 0;
|
|
return secs;
|
|
}
|