CAREY@CLEMSON.BITNET (Jim Blalock) (01/05/90)
(Maybe this will go to the right list this time. That's what I get for not using the REPLY command :-) Since everyone's so interested in date conversion these days... The following rexx procedure is a modified version of algorithm 199 from ACM's "Collected Algorithms". (This is not the same as the 'tableless date conversion' posted recently.) Procedure JDAY converts a Gregorian date into the number of days since Jan. 1, 0000 (same as rexx's "basedate" format), while procedure JDATE converts it back. (The original adds 1721119 to the basedate, creating a "real" Julian date of number-of-days-since-approx-4700-BC.) The algorithm claims to work for any valid (positive!) Gregorian date. /* rexx */ Do Forever /* dumb driver to call the procedures */ say "Enter Gregorian date to convert, or END to terminate test." valid = DUNNO do while valid ^= TRUE if valid = FALSE then do say "Invalid Gregorian date, use format ""mm/dd/yyyy""." end pull answer if answer = 'END' then exit parse var answer m "/" d "/" y if datatype(d) = "NUM" & datatype(m) = "NUM" , & datatype(y) = "NUM" , then valid = TRUE else valid = FALSE end j = JDAY(m,d,y) say " Converted date value = " j "." gdate = JDATE(j) say " Restored date value is: " gdate "." End exit JDAY: procedure parse upper arg m, d, y if m > 2 then m = m - 3 else do m = m + 9 y = y - 1 end c = y % 100 ya = y - (100 * c) j = (146097 * c) % 4 + (1461 * ya) % 4 + ((153 * m) + 2) % 5 + d return (j) JDATE: procedure parse upper arg j y = ((4 * j) - 1) % 146097 j = ((4 * j) - 1) - (146097 * y) d = j % 4 j = ((4 * d) + 3) % 1461 d = ((4 * d) + 3) - (1461 * j) d = (d + 4) % 4 m = ((5 * d) - 3) % 153 d = ((5 * d) - 3) - (153 * m) d = (d + 5) % 5 y = (100 * y) + j if m < 10 then m = m + 3 else do m = m - 9 y = y + 1 end gdate = m || "/" d || "/" || y return (gdate)