/* ************************************************* * * * Julian <-> date program * * * ************************************************* */ /* JD -> help JD JD -> JD to Date JD yyy mm dd -> Date to JD */ #include <stdio.h> #include <stdlib.h> #include <math.h> double julian(int nYear, int nMonth, double dDay) { double da, db; double dJD; if (nMonth < 3){ nMonth += 12; nYear--; } // Calc. body da = floor(nYear/100.0); db = 2.0 - da + floor(da / 4.0); dJD = floor(365.25 * nYear) + floor(30.6001 * (nMonth + 1)) + dDay + db + 1720994.5; if (dJD < 2299160.5){ dJD -= db; } return dJD; } void juian_date(double dJD, int *nYear, int *nMonth, double *dDay) { int nY, nM; double da, db, dd; double dJDs = dJD + 0.5; double dJDi = floor(dJDs); double dJDf = dJDs - dJDi; if (dJDi > 2299160.0){ da = floor((dJDi - 1867216.25) / 36524.25); dJDi += (1.0 + da - floor(da / 4.0)); } db = dJDi + 1524.0; nY = (int)(floor((db - 122.1) / 365.25)); dd = db - floor(nY * 365.25); nM = (int)(floor(dd / 30.6001)); // Write Day *dDay = dd - floor(nM * 30.6001) + dJDf; // Write Month if (nM < 14){ *nMonth = nM - 1; }else{ *nMonth = nM - 13; } // Write Year if (*nMonth > 2){ *nYear = nY - 4716; }else{ *nYear = nY - 4715; } } int jd_week(double dJD) { int nJD = (int)floor(dJD + 0.5); int nWeek = nJD % 7; if (nWeek < 0){ nWeek += 7; } return nWeek; } int main(int argc, char *argv[]) { int nYY = 0; int nMM = 1; int nWeek; double dDay = 1.0; double dJD; char *pWeek[] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; /* argc == 2 JD to Date */ if (argc == 2){ dJD = atof(argv[1]); juian_date(dJD, &nYY, &nMM, &dDay); nWeek = jd_week(dJD); printf("%f = %d/%d/%f(%s)\n", dJD, nYY, nMM, dDay, pWeek[nWeek]); return 0; } /* argc > 2 Date to JD */ if (argc >= 3){ nYY = atoi(argv[1]); nMM = atoi(argv[2]); if (argc >= 4){ dDay = atof(argv[3]); } dJD = julian(nYY, nMM, dDay); nWeek = jd_week(dJD); juian_date(dJD, &nYY, &nMM, &dDay); printf("%d/%d/%f(%s) = %f\n", nYY, nMM, dDay, pWeek[nWeek], dJD); return 0; } /* Help */ puts ("JD to Date ---> A>JD julian"); puts ("Date to JD ---> A>JD year month day"); return -1; } |