| home | contents | previous | next page | send comment | send link | add bookmark |

testdate.cpp

/*-------------------------------------------------------------------------*
    TESTDATE.CPP

    tests julian day to gregorian calander date conversion used in the
    timewarp utility 

    by:  Stephen R. Schmitt
 *-------------------------------------------------------------------------*/

#include <math.h>
#include <stdio.h>

/*-------------------------------------------------------------------------*
 *  "jul_to_greg" convert from julian day number to month/day/year
 *
 *  returns: nothing
 */
void jul_to_greg( long  n,                      // julian day
                  char *m,                      // month
                  char *d,                      // day 
                  int  *y )                     // year with century 
{
    long dd;                                    // work variable

    n -= 1721118L;                              // base calcs on 3/1/1 BC
    *y = (int)((4 * n - 1) / 146097L);          // get century number
    n = 4 * n - 1 - (146097L * *y);             // ..remove that many days
    dd = n / 4;                                 // get to the year  
    n = (4 * dd + 3) / 1461;                    // ..within the century 
    *y = (int)(100 * *y + n);                   // ..then year with century 
    dd = 4 * dd + 3 - 1461 * n;                 // get to days within 4 yrs
    dd = (dd + 4) / 4;                          // get days within base yr
    *m = (int)(5 * dd - 3) / 153;               // get month
    dd = 5 * dd - 3 - (153 * *m);               // get to the day ..
    *d = (int)(dd + 5) / 5;                     // ..within the month

    if( *m < 10)                                // need to adjust month?
        *m += 3; 
    else
    {
        *m -= 9;                                // adjust for March base
        (*y)++;                                 // ..date and fix year too
    }

    return;
}

/*-------------------------------------------------------------------------*
 *  "julian_day" determine Julian day from calendar date
 *   ref: Jean Meeus, "Astronomical Algorithms", Willmann-Bell, 1991
 *
 *  returns: nothing
 */
double julian_day( char month, char day, int year )
{
    double a, b, jd;
    int gregorian;

    if( year < 1583 )
        gregorian = 0;
    else
        gregorian = 1;
    
    if( month == 1 || month == 2 )
    {
        year = year - 1;
        month = month + 12;
    }

    a = floor( (double)year / 100 );
    if( gregorian )
        b = 2 - a + floor( a / 4 );
    else
        b = 0.0;

    jd = floor( 365.25 * ( (double)year + 4716 ) ) + 
         floor( 30.6001 * ( (double)month + 1 ) ) + 
         (double)day + b - 1524.5;
    
    return( jd );
}    

main()
{
    FILE *fp;
    int i;
    long julian, j;                               // julian date 
    char mon, day;
    int year;

    fp = fopen( "testdate.txt", "w" );
    julian = 2450000L;
    for( i = 0; i < 2000; i++ )
    {
        jul_to_greg( julian, &mon, &day, &year );
        j = julian_day( mon, day, year );
        fprintf( fp, 
                 "%ld = %02d-%02d-%02d = %ld\n", 
                 julian, mon, day, year, (long)j );
        julian++;
    }
    fclose( fp );
}

| home | contents | previous | next page | send comment | send link | add bookmark |

Copyright © 2004, Stephen R. Schmitt