10/07/2007

Date/Time conversion algorithms

/**********************************************************************
NOTE TO ALL USERS:

This file contains 6 main() programs and 12 C functions.
Before compiling with a C compiler, this file should be split into
6 files; each having one main program and two C functions. The six
files are separated by equal signs (========== name =============).


**********************************************************************/

/*============================= GPS_YD.C ===============================*/
#include
#include
#define JAN61980 44244
#define JAN11901 15385
#define SEC_PER_DAY 86400.0
void gps_to_ydhms(long gps_week, double sec_of_week,
long *year, long *yday, long *hour, long *minute, double *second);
void ydhms_to_gps(long year, long yday, long hour, long minute, double second,
long *gps_week, double *sec_of_week);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void main()
{
long gps_week, year, yday, hour, minute;
double sec_of_week, second;

gps_week = 633; sec_of_week = 241000.0;

gps_to_ydhms(gps_week, sec_of_week, &year, &yday, &hour, &minute, &second);
printf("%ld %lf %ld %ld %ld %ld %lf\n",
gps_week, sec_of_week, year, yday, hour, minute, second);
ydhms_to_gps(year, yday, hour, minute, second, &gps_week, &sec_of_week);
printf("%ld %lf %ld %ld %ld %ld %lf\n",
gps_week, sec_of_week, year, yday, hour, minute, second);
}
/*------------------------------------------------------------------------
* gps_to_ydhms *
* *
* Input: gps_week, sec_of_week *
* *
* Output: year, yday, hour, minute, second *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void gps_to_ydhms(long gps_week, double sec_of_week,
long *year, long *yday, long *hour, long *minute, double *second)
{
long mjd, days_fr_jan1_1901;
double fmjd;
long delta_yrs, num_four_yrs, years_so_far, days_left;

mjd = gps_week*7 + sec_of_week/SEC_PER_DAY + JAN61980;
fmjd = fmod(sec_of_week, SEC_PER_DAY)/SEC_PER_DAY;

days_fr_jan1_1901 = mjd - JAN11901;
num_four_yrs = days_fr_jan1_1901/1461;
years_so_far = 1901 + 4*num_four_yrs;
days_left = days_fr_jan1_1901 - 1461*num_four_yrs;
delta_yrs = days_left/365 - days_left/1460;

*year = years_so_far + delta_yrs;
*yday = days_left - 365*delta_yrs + 1;
*hour = fmjd*24.0;
*minute = fmjd*1440.0 - *hour*60.0;
*second = fmjd*86400.0 - *hour*3600.0 - *minute*60.0;
}
/*------------------------------------------------------------------------
* ydhms_to_gps *
* *
* Input: year, yday, hour, minute, second *
* *
* Output: gps_week, sec_of_week *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void ydhms_to_gps(long year, long yday, long hour, long minute, double second,
long *gps_week, double *sec_of_week)
{
long mjd;
double fmjd;

mjd = ((year - 1901)/4)*1461 + ((year - 1901)%4)*365 + yday - 1 + JAN11901;
fmjd = ((second/60.0 + minute)/60.0 + hour)/24.0;

*gps_week = (mjd - JAN61980)/7;
*sec_of_week = ( (mjd - JAN61980) - *gps_week*7 + fmjd )*SEC_PER_DAY;
}
/*============================= GPS_YMD.C ===============================*/
#include
#include

#define JAN61980 44244
#define JAN11901 15385
#define SEC_PER_DAY 86400.0

void gps_to_ymdhms(long gps_week, double sec_of_week, long *year,
long *month, long *mday, long *hour, long *minute, double *second);
void ymdhms_to_gps(long year, long month, long mday, long hour,
long minute, double second, long *gps_week, double *sec_of_week);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void main()
{
long gps_week;
long year, month, mday, hour, minute;
double sec_of_week, second;

gps_week = 842; sec_of_week = 475200.0;

gps_to_ymdhms(gps_week, sec_of_week, &year, &month, &mday, &hour, &minute, &second);
printf("%ld %lf %ld %ld %ld %ld %ld %lf\n",
gps_week, sec_of_week, year, month, mday, hour, minute, second);

gps_week = 0; sec_of_week = 0.0;
ymdhms_to_gps(year, month, mday, hour, minute, second, &gps_week, &sec_of_week);
printf("%ld %lf %ld %ld %ld %ld %ld %lf\n",
gps_week, sec_of_week, year, month, mday, hour, minute, second);
}
/*------------------------------------------------------------------------
* gps_to_ymdhms *
* *
* Input: gps_week, sec_of_week *
* *
* Output: year, month, mday, hour, minute, second *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void gps_to_ymdhms(long gps_week, double sec_of_week, long *year,
long *month, long *mday, long *hour, long *minute, double *second)
{
static long month_day[2][13] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}
};
long leap, guess, more;
long yday, mjd, days_fr_jan1_1901;
long delta_yrs, num_four_yrs, years_so_far, days_left;
double fmjd;

mjd = gps_week*7 + sec_of_week/SEC_PER_DAY + JAN61980;
fmjd = fmod(sec_of_week, SEC_PER_DAY)/SEC_PER_DAY;

printf(" mjd = %ld fmjd = %16.14lf \n",mjd,fmjd);

days_fr_jan1_1901 = mjd - JAN11901;
num_four_yrs = days_fr_jan1_1901/1461;
years_so_far = 1901 + 4*num_four_yrs;
days_left = days_fr_jan1_1901 - 1461*num_four_yrs;
delta_yrs = days_left/365 - days_left/1460;

*year = years_so_far + delta_yrs;
yday = days_left - 365*delta_yrs + 1;
*hour = fmjd*24.0;
*minute = fmjd*1440.0 - *hour*60.0;
*second = fmjd*86400.0 - *hour*3600.0 - *minute*60.0;

leap = ( *year%4 == 0 );
guess = yday*0.032;
more = ( ( yday - month_day[leap][guess+1] ) > 0 );
*month = guess + more + 1;
*mday = yday - month_day[leap][guess+more];
}
/*------------------------------------------------------------------------
* ymdhms_to_gps *
* *
* Input: year, month, mday, hour, minute, second *
* *
* Output: gps_week, sec_of_week *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void ymdhms_to_gps(long year, long month, long mday, long hour,
long minute, double second, long *gps_week, double *sec_of_week)
{
static long month_day[2][12] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}
};
long yday, mjd, leap;
double fmjd;

leap = (year%4 == 0);
yday = month_day[leap][month-1] + mday;

mjd = ((year - 1901)/4)*1461 + ((year - 1901)%4)*365 + yday - 1 + JAN11901;
fmjd = ((second/60.0 + minute)/60.0 + hour)/24.0;

*gps_week = (mjd - JAN61980)/7;
*sec_of_week = ( (mjd - JAN61980) - *gps_week*7 + fmjd )*SEC_PER_DAY;
}
/*============================= MJD_GPS.C ===============================*/
#include
#include

#define JAN61980 44244
#define JAN11901 15385
#define SEC_PER_DAY 86400.0

void mjd_to_gps(long mjd, double fmjd, long *gps_week, double *sec_of_week);
void gps_to_mjd(long gps_week, double sec_of_week, long *mjd, double *fmjd);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void main()
{
long mjd=0, gps_week=0;
double fmjd=0.0, sec_of_week=0.0;

mjd = 48522; fmjd = 0.75;

printf("%ld %lf %ld %lf\n", mjd, fmjd, gps_week, sec_of_week);

mjd_to_gps(mjd, fmjd, &gps_week, &sec_of_week);
printf("%ld %lf %ld %lf\n", mjd, fmjd, gps_week, sec_of_week);

gps_week = 736; sec_of_week = 410000.0;

gps_to_mjd(gps_week, sec_of_week, &mjd, &fmjd);
printf("%ld %lf %ld %lf\n", mjd, fmjd, gps_week, sec_of_week);
}
/*------------------------------------------------------------------------
* mjd_to_gps *
* *
* Input: mjd, fmjd *
* *
* Output: gps_week, sec_of_week *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void mjd_to_gps(long mjd, double fmjd, long *gps_week, double *sec_of_week)
{
*gps_week = (mjd - JAN61980)/7;
*sec_of_week = ( (mjd - JAN61980) - *gps_week*7 + fmjd )*SEC_PER_DAY;
}
/*------------------------------------------------------------------------
* gps_to_mjd *
* *
* Input: gps_week, sec_of_week *
* *
* Output: mjd, fmjd *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void gps_to_mjd(long gps_week, double sec_of_week, long *mjd, double *fmjd)
{
*mjd = gps_week*7 + sec_of_week/SEC_PER_DAY + JAN61980;
*fmjd = fmod(sec_of_week, SEC_PER_DAY)/SEC_PER_DAY;
}
/*============================= MJD_YD.C ===============================*/
#include
#include

#define JAN61980 44244
#define JAN11901 15385
#define SEC_PER_DAY 86400.0

void mjd_to_ydhms(long mjd, double fmjd, long *year, long *yday,
long *hour, long *minute, double *second);
void ydhms_to_mjd(long year, long yday, long hour, long minute,
double second, long *mjd, double *fmjd);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void main()
{
long mjd, year, yday, hour, minute;
double fmjd, second;

mjd = 49400; fmjd = 0.65;
mjd_to_ydhms(mjd, fmjd, &year, &yday, &hour, &minute, &second);
printf("%ld %lf %ld %ld %ld %ld %lf\n",
mjd, fmjd, year, yday, hour, minute, second);
ydhms_to_mjd(year, yday, hour, minute, second, &mjd, &fmjd);
printf("%ld %lf %ld %ld %ld %ld %lf\n",
mjd, fmjd, year, yday, hour, minute, second);

}
/*------------------------------------------------------------------------
* mjd_to_ydhms *
* *
* Input: mjd, fmjd *
* *
* Output: year, yday, hour, minute, second *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void mjd_to_ydhms(long mjd, double fmjd, long *year, long *yday,
long *hour, long *minute, double *second)
{
long days_fr_jan1_1901, delta_yrs, num_four_yrs, years_so_far, days_left;

days_fr_jan1_1901 = mjd - JAN11901;
num_four_yrs = days_fr_jan1_1901/1461;
years_so_far = 1901 + 4*num_four_yrs;
days_left = days_fr_jan1_1901 - 1461*num_four_yrs;
delta_yrs = days_left/365 - days_left/1460;

*year = years_so_far + delta_yrs;
*yday = days_left - 365*delta_yrs + 1;
*hour = fmjd*24.0;
*minute = fmjd*1440.0 - *hour*60.0;
*second = fmjd*86400.0 - *hour*3600.0 - *minute*60.0;
}
/*------------------------------------------------------------------------
* ydhms_to_mjd *
* *
* Input: year, yday, hour, minute, second *
* *
* Output: mjd, fmjd *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void ydhms_to_mjd(long year, long yday, long hour, long minute,
double second, long *mjd, double *fmjd)
{
*mjd = ((year - 1901)/4)*1461 + ((year - 1901)%4)*365 + yday - 1 + JAN11901;
*fmjd = ((second/60.0 + minute)/60.0 + hour)/24.0;
}
/*============================= MJD_YMD.C ===============================*/
#include
#include

#define JAN61980 44244
#define JAN11901 15385
#define SEC_PER_DAY 86400.0

void mjd_to_ymdhms(long mjd, double fmjd, long *year, long *month,
long *mday, long *hour, long *minute, double *second);
void ymdhms_to_mjd(long year, long month, long mday, long hour, long minute,
double second, long *mjd, double *fmjd);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void main()
{
long mjd, year, month, mday, hour, minute;
double fmjd, second;

mjd = 48257; fmjd = 0.65;
mjd_to_ymdhms(mjd, fmjd, &year, &month, &mday, &hour, &minute, &second);
printf("%ld %lf %ld %ld %ld %ld %ld %lf\n",
mjd, fmjd, year, month, mday, hour, minute, second);

ymdhms_to_mjd(year, month, mday, hour, minute, second, &mjd, &fmjd);
printf("%ld %lf %ld %ld %ld %ld %ld %lf\n",
mjd, fmjd, year, month, mday, hour, minute, second);
}
/*------------------------------------------------------------------------
* mjd_to_ymdhms *
* *
* Input: mjd, fmjd *
* *
* Output: year, month, mday, hour, minute, second *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void mjd_to_ymdhms(long mjd, double fmjd, long *year, long *month,
long *mday, long *hour, long *minute, double *second)
{
static long month_day[2][13] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}
};
long days_fr_jan1_1901, delta_yrs, num_four_yrs, years_so_far, days_left;
long yday, leap, guess, more;

days_fr_jan1_1901 = mjd - JAN11901;
num_four_yrs = days_fr_jan1_1901/1461;
years_so_far = 1901 + 4*num_four_yrs;
days_left = days_fr_jan1_1901 - 1461*num_four_yrs;
delta_yrs = days_left/365 - days_left/1460;

*year = years_so_far + delta_yrs;
yday = days_left - 365*delta_yrs + 1;
*hour = fmjd*24.0;
*minute = fmjd*1440.0 - *hour*60.0;
*second = fmjd*86400.0 - *hour*3600.0 - *minute*60.0;
leap = ( *year%4 == 0 );
guess = yday*0.032;
more = (( yday - month_day[leap][guess+1] ) > 0);
*month = guess + more + 1;
*mday = yday - month_day[leap][guess+more];
}
/*------------------------------------------------------------------------
* ymdhms_to_mjd *
* *
* Input: year, month, mday, hour, minute, second *
* *
* Output: mjd, fmjd *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void ymdhms_to_mjd(long year, long month, long mday, long hour, long minute,
double second, long *mjd, double *fmjd)
{
static long month_day[2][12] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}
};
long yday, leap;

leap = (year%4 == 0);
yday = (month_day[leap][month-1] + mday);
*mjd = ((year - 1901)/4)*1461 + ((year - 1901)%4)*365 + yday - 1 + JAN11901;
*fmjd = ((second/60.0 + minute)/60.0 + hour)/24.0;
}
/*============================= YD_MJD.C ===============================*/
#include
#include

void yday_to_mday(long year, long yday, long *month, long *mday);
void mday_to_yday(long year, long month, long mday, long *yday);
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void main()
{
long year, yday, month, mday;

year = 1993; yday = 365;

yday_to_mday(year, yday, &month, &mday);
printf("%ld %ld %ld %ld\n", year, yday, month, mday);

mday_to_yday(year, month, mday, &yday);
printf("%ld %ld %ld %ld\n", year, yday, month, mday);

}
/*------------------------------------------------------------------------
* yday_to_mday *
* *
* Input: year, yday *
* *
* Output: month, mday *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void yday_to_mday(long year, long yday, long *month, long *mday)
{
static long month_day[2][13] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}
};
long leap, guess, more;

leap = (year%4 == 0);
guess = yday*0.032;
more = (( yday - month_day[leap][guess+1] ) > 0);
*month = guess + more + 1;
*mday = yday - month_day[leap][guess+more];
}
/*------------------------------------------------------------------------
* mday_to_yday *
* *
* Input: year, month, mday *
* *
* Output: yday *
* *
* Author: Benjamin W. Remondi Date: November 1999 *
*-----------------------------------------------------------------------*/
void mday_to_yday(long year, long month, long mday, long *yday)
{
static long month_day[2][12] = {
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},
{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}
};
long leap;
leap = (year%4 == 0);
*yday = month_day[leap][month-1] + mday;
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

No comments: