#include #include "dates.h" static int tosod( int hour, int minute, int second ); static int todoy( int year, int month, int day ); static void to_mmdd ( int year, int doy, int *month, int *day ); #define NINT(t) ((int) ((t<0) ? t-.5 : t+.5)) /******************************************************/ double DateValue(year, month, day, hour, minute, second) int year, month, day, hour, minute, second; { long sod, soy; int doy; double d; /* First get the day of the year */ doy = todoy (year, month, day); if (doy == -1) return (-1.0); /* Get the second of the day */ sod = tosod(hour, minute, second); if (sod == -1) return (-1.0); /* Get second of the year */ soy = (doy-1) * SECONDS_DAY + sod; /* Get Fraction of year */ if (year %4 == 0) d = (double) year + (double) soy / SECONDS_YEAR_LEAP; else d = (double) year + (double) soy / SECONDS_YEAR; return (d); } /*********************************************************/ /* Convert hour, minute, second to second of the day. * Expects hour to be form 0 to 23. */ static int tosod(hour, minute, second) int hour, minute, second; { int n, bad=0; if (hour < 0 || hour > 23) { fprintf (stderr, "XkDateValue: Got bad hour value: %d\n", hour); bad = 1; } if (minute < 0 || minute > 59) { fprintf (stderr, "XkDateValue: Got bad minute value: %d\n", minute); bad = 1; } if (second < 0 || second > 59) { fprintf (stderr, "XkDateValue: Got bad second value: %d\n", second); bad = 1; } if (bad) return (-1); n = hour*3600 + minute*60 + second; return (n); } /*********************************************************************/ static int todoy(year,month,day) int year,month,day; /* convert year, month, day to year, day of year returns the day of year if succesful, -1 otherwise */ { static int mona[11] = {31,59,90,120,151,181,212,243,273,304,334}; int doy; if (month < 1 || month > 12) { fprintf (stderr, "XkDateValue: Got bad month value: %d\n", month); } if (day <1 || day > 31 ) { fprintf (stderr, "XkDateValue: Got bad day value: %d\n", day); } if (month < 1 || month > 12 || day <1 || day > 31 ) return -1; if (month == 1) doy = day; else { doy = mona[month-2]+day; if ((year % 4 ==0) && month >2) doy=doy+1; } return doy; } /*********************************************************************/ void GetCalendarDate(d, year, month, day, hour, minute, second) double d; int *year, *month, *day, *hour, *minute, *second; { int y, nsec, ndays, doy, mon, dy, h, m, s, nsecs; double f; y = (int) d; f = d - y; if (y % 4 == 0) nsec = NINT( f * SECONDS_YEAR_LEAP ); else nsec = NINT( f * SECONDS_YEAR ); ndays = nsec / SECONDS_DAY; doy = ndays + 1; to_mmdd (y, doy, &mon, &dy); nsecs = nsec - (ndays*SECONDS_DAY); h = nsecs / 3600; m = (nsecs - (h * 3600)) / 60; s = nsecs - (h * 3600) - (m * 60); *year = y; *month = mon; *day = dy; *hour = h; *minute = m; *second = s; } /**************************************************************************/ static void to_mmdd (year, doy, month, day) int year, doy, *month, *day; { static int mona[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int idoy, imon; idoy=doy; imon=0; if (year%4 == 0) mona[1]=29; else mona[1]=28; while (idoy-mona[imon]>0) { idoy-=mona[imon]; imon++; } *day=idoy; *month=imon+1; }