Path: utzoo!utgpu!news-server.csri.toronto.edu!bonnie.concordia.ca!uunet!mcsun!ukc!cf-cm!cybaswan!ex1neil From: ex1neil@cybaswan.UUCP (Neil Woods) Newsgroups: comp.lang.c Subject: Re: Julian date routines needed Summary: date routines in C Keywords: julian date, C, unix,dos Message-ID: <2310@cybaswan.UUCP> Date: 19 Feb 91 12:56:07 GMT References: <1753@manta.NOSC.MIL> Reply-To: ex1neil@cybaswan.UUCP (Neil Woods) Organization: University College Swansea Lines: 116 In article <1753@manta.NOSC.MIL> grantk@manta.NOSC.MIL (Kelly J. Grant) writes: >Howdy networld > >About 100,000 years ago I had some Julian date routines (in dBASE) to >convert YY/MM/DD into a format suitable for math, and also to convert >back to normal dates. We called these JULTOCAL and CALTOJUL. I now >have a need for these algorithms for a UNIX program. Would any of >you kind souls have these routines lying around in your book of tricks >[right next to your hanoi.c file maybe :-)] The following should do the trick: ------------(Cut Here)------------ #include /* returns Julian day number --given a string of the form xx/yy/zz. ** To calculate the day of the week use the return value % 7. */ long julian_day (date_str) char *date_str; { long jdn; int month, day, year; sscanf (date_str, "%d/%d/%d", &month, &day, &year); if (year < 100) year += 1900; /* assume 20th century */ if (year < 1000) year += 2000; /* assume 21st */ jdn = (long) year * 367 + month * 275 / 9 - (year + (month > 2)) * 7 / 4 - ((year - (month < 3)) / 100 + 1) * 3 / 4 + day + 1721029L; return (jdn); } /* converts from a given Julian day number to a formatted string of the form ** xx/yy/zz and places it in date_string. Returns the century (e.g. 19). */ int julian_date (jdn, date_string) long jdn; char *date_string; { long year, month, day, temp_var; int century; temp_var = jdn - 1721119L; year = (4 * temp_var - 1) / 146097L; temp_var = 4 * temp_var - 1 - 146097L * year; day = temp_var / 4; temp_var = (4 * day + 3) / 1461; day = 4 * day + 3 - 1461 * temp_var; day = (day + 4) / 4; month = (5 * day - 3) / 153; day = 5 * day - 3 - 153 * month; day = (day + 5) / 5; year = 100 * year + temp_var; if (month < 10) month += 3; else { month -= 9; year++; } century = (int)year / 100; year = year - (century * 100); sprintf (date_string, "%02ld/%02ld/%02ld", month, day, year); return ((int) century); } /* Return the difference between two dates in days as a signed long */ long diff_date (date1, date2) char *date1, *date2; { return (julian_day (date2) - julian_day (date1)); } int main (argc, argv) int argc; char *argv[]; { if (argc != 3) { fprintf (stderr, "Usage: diffdate first_date second_date\n"); fprintf (stderr, "Where each date is of the form mm/dd/yy\n"); return 1; } printf ("Difference in days = %ld\n", diff_date (argv[1], argv[2])); return 0; } >Muchos gracias in advance > >Kelly Your Welcome. Neil. -- Neil Woods. | JANET: ex1neil@uk.ac.swan.pyr University College Swansea, | UUCP : ...!mcvax!ukc!swan.pyr!ex1neil Wales, UK. | ARPA : ex1neil%pyr.swan.ac.uk@nfsnet-relay.ac.uk