home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_07 / dat.c < prev    next >
C/C++ Source or Header  |  1993-01-30  |  1KB  |  46 lines

  1. #include "date.h"
  2.  
  3. char *month_names[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL",
  4.          "AUG", "SEP", "OCT", "NOV", "DEC" };
  5.  
  6. #define T0 1721060L
  7.  
  8. long dmy_to_day(int day, int month, long year, int julian)
  9. {
  10.    static int m[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
  11.                  /*       Ja  Fe  Ma  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec   */
  12.    long rval;
  13.  
  14.    if( year >= 0L)
  15.       {
  16.       rval = year*365L + year / 4L;
  17.       if( !julian)
  18.          rval += -year / 100L + year / 400L;
  19.       }
  20.    else
  21.       {
  22.       rval = year*365L + (year-3L) / 4L;
  23.       if( !julian)
  24.          rval += - (year-99L) / 100L + (year-399L) / 400L;
  25.       }
  26.  
  27.    if( julian)
  28.       rval -= 2L;
  29.    if( month < 3 && !(year % 4L))
  30.       if( (year % 100L) || !(year % 400L) || julian)
  31.          rval--;
  32.    rval += (long)m[month - 1] + (long)day;
  33.    return( rval + T0);
  34. }
  35.  
  36. void day_to_dmy( long day, int *d, int *m, long *y, int julian)
  37. {
  38.    *y = ( day - T0) / 365L - 3L;
  39.    while( dmy_to_day( 1, 1, *y, julian) < day)
  40.       (*y)++;
  41.    while( dmy_to_day( 1, 1, *y, julian) > day)
  42.       (*y)--;
  43.    for( *m = 1; dmy_to_day(0, (*m)+1, *y, julian) < day; (*m)++);
  44.    *d = (int)( day - dmy_to_day(0, *m, *y, julian));
  45. }
  46.