// WSGDATE.C - time conversion utility file #include #include #include "wsgdate.h" static int ndays[13] = {0,0,31,59,90,120,151,181,212,243,273,304,334}; double etoh(int year,int mnth, int day, int hh,int mm, float ss) { long doy,dyears; long n4,n100,n400,nlpyrs; double tdays; double dres; /* if given month and day, convert to day of year */ doy = ndays[mnth] + day; if(isleap(year) && (mnth > 2)) ++doy; dyears = year - 1970; n4 = (dyears+1)/4; n100 = (dyears+69)/100; n400 = (dyears+369)/400; nlpyrs = n4 - n100 + n400; tdays = (dyears * (double)365) + nlpyrs; dres=(double) 24.*60.*60.*(tdays+doy-1)+(double)60.*60.*hh+60.*mm+ss; return dres; } int isleap(int year) { if (year%400 == 0) return(1); if (year%4 != 0) return(0); if (year%100 == 0) return(0); else return(1); } int mdays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int dom(int dofy,int *mon,int *day,int year) { if (dofy < 1) { *mon = 0; *day = 0; return(0); } if (isleap(year)) mdays[2] = 29; else mdays[2] = 28; for (*mon = 1; *mon <= 12; (*mon)++) { *day = dofy; if ((dofy -= mdays[*mon]) <= 0) return(1); } *mon = 0; *day = 0; return(0); } static double di400y=146097.; /* days in 400 years */ static double di100y=36524.; /* days in 100 years */ static double di4y=1461.; /* days in 4 years */ int htoe(double ttt,int *yr,int *mnth, int *day, int *hh,int *mm, float *ss) { double tot,days,secs,hours,mins,n400yp,n100yp,n4yp,n1yp,i,secs70; int month,dim; double year,tfract; secs70=31536000.*1492.+31622400.*477.; /* number of seconds from year 1 to Jan 1., 1970 */ ttt+=secs70; tfract=modf(ttt,&tot); modf(tot/86400.,&days); secs=tot-days*86400.; modf(secs/3600.,&hours); secs-=hours*3600.; modf(secs/60.,&mins); secs-=mins*60.; *ss=(float)secs+(float)tfract; *mm=(int)mins; *hh=(int)hours; modf(days/di400y,&n400yp); /* find number of 400 year periods */ days-=di400y*n400yp; /* days < 400 years */ if (days == 146096.) n100yp=3; /* last year in a 400 year period */ else modf(days/di100y,&n100yp); days-=di100y*n100yp; /* days < 100 years */ modf(days/di4y,&n4yp); /* find number of 4 year periods */ days-=di4y*n4yp; /* days < 4 years */ modf(days/365.,&n1yp); /* find number of 1 year periods */ if (n1yp == 4) n1yp=3; days-=365.*n1yp; /* days < 1 year */ year=400.*n400yp+100.*n100yp+4.*n4yp+n1yp+1.; /* compute year */ days+=1.; i=dom((int)days,&month,&dim,(int)year); /* days = day < 1 year ; mon = month 1-12, returned */ /* dim = days in month 1-31, returned ; year = the year, passed only to test for leap year */ if (i <= 0) { return(0); } *yr=(int)year; /* year */ *day=(int)days; /* day of year */ *mnth=month; /* month */ *day=dim; /* day of month */ return(1); } long jdate(int year, int month, int day) { int doy = ndays[month] + day; if(isleap(year) && (month > 2)) ++doy; return 1000L*(long)year+(long)doy; }