' JUL2GRE$(0.0) Convert Julian Date to Gregorian 04/05/1988-10/04/2004 ' -------------------------------------------------------------------------- ' Copyright (C) 1988-2004 by Vladimir Veytsel www.davar.net ' Type --------------------------------------------------------------------- ' Function ' Description -------------------------------------------------------------- ' JUL2GRE$ function converts Julian date into Gregorian date format. ' Declaration -------------------------------------------------------------- ' DECLARE FUNCTION JUL2GRE$(Jul.Date$) ' Parameter ---------------------------------------------------------------- ' Jul.Date$ - Julian date in the form of YY-DDD or CCYY-DDD, ' where DDD is a day number within a year. ' Value -------------------------------------------------------------------- ' If specified Julian date is valid, i.e.: ' it is non-empty and ' it has length either of 6 or 8 characters and ' it is DIGITAL (with the exception of date field delimiter) and ' day number lies within range of 1-365 ' (or 1-366, considering specified year leap characteristic), ' then MM-DD-YY or MM-DD-CCYY (date in Gregorian format) is returned ' to the point of function invocation, ' else "" (empty string) is returned to the point of invocation. ' Notes -------------------------------------------------------------------- ' - Delimiter of parameter date fields is irrelevant and can be any ' symbol. Date fields are extracted from fixed positions. ' - EMPTY date is considered to be an INVALID one - Julian date ' is an internal format that doesn't require a default. ' Examples ----------------------------------------------------------------- ' JUL2GRE$("" )="" ' JUL2GRE$("87-31" )="" ' JUL2GRE$("1987-31" )="" ' JUL2GRE$("19*7-031")="" ' JUL2GRE$("1988-0#1")="" ' JUL2GRE$("87-000" )="" ' JUL2GRE$("87-366" )="" ' JUL2GRE$("1988-367")="" ' JUL2GRE$("87-031" )="01-31-87" ' JUL2GRE$("87-059" )="02-28-87" ' JUL2GRE$("87-090" )="03-31-87" ' JUL2GRE$("87-120" )="04-30-87" ' JUL2GRE$("87-151" )="05-31-87" ' JUL2GRE$("87-181" )="06-30-87" ' JUL2GRE$("87-212" )="07-31-87" ' JUL2GRE$("87-243" )="08-31-87" ' JUL2GRE$("87-273" )="09-30-87" ' JUL2GRE$("87-304" )="10-31-87" ' JUL2GRE$("87-334" )="11-30-87" ' JUL2GRE$("87-365" )="12-31-87" ' JUL2GRE$("1988-031")="01-31-1988" ' JUL2GRE$("1988-060")="02-29-1988" ' JUL2GRE$("1988-091")="03-31-1988" ' JUL2GRE$("1988-121")="04-30-1988" ' JUL2GRE$("1988-152")="05-31-1988" ' JUL2GRE$("1988-182")="06-30-1988" ' JUL2GRE$("1988-213")="07-31-1988" ' JUL2GRE$("1988-244")="08-31-1988" ' JUL2GRE$("1988-274")="09-30-1988" ' JUL2GRE$("1988-305")="10-31-1988" ' JUL2GRE$("1988-335")="11-30-1988" ' JUL2GRE$("1988-366")="12-31-1988" ' External Functions ------------------------------------------------------- DECLARE FUNCTION DIGITAL%(Strng$,Delim$) DECLARE FUNCTION LEAP% (Year$) ' Start Function ----------------------------------------------------------- DEFINT A-Z ' All defaulted variables are integer FUNCTION JUL2GRE$(Jul.Date$) PUBLIC ' Constant ----------------------------------------------------------------- Month.Days$="31,28,31,30,31,30,31,31,30,31,30,31" ' Check Specified Date for Valid Length (6 or 8 Characters) ---------------- IF ((LEN(Jul.Date$)<>6) AND _ (LEN(Jul.Date$)<>8)) THEN JUL2GRE$="" EXIT FUNCTION END IF ' Check Specified Date for Digital Value ----------------------------------- IF (NOT(DIGITAL%(LEFT$(Jul.Date$,2-(LEN(Jul.Date$)=8))+ _ RIGHT$(Jul.Date$,3),""))) THEN JUL2GRE$="" EXIT FUNCTION END IF ' Parse Date to Be Converted ----------------------------------------------- Year$= LEFT$(Jul.Date$,2-2*(LEN(Jul.Date$)=8)) Day =VAL(RIGHT$(Jul.Date$,3)) ' Check Day for Lying within Proper Borders -------------------------------- IF (NOT((Day>0) AND _ (Day<366-LEAP%(Year$)))) THEN JUL2GRE$="" EXIT FUNCTION END IF ' Adjust Number of February Days for the Leap Year ------------------------- IF (LEAP%(Year$)) THEN MID$(Month.Days$,5,1)="9" ' Compute Gregorian Month Number and Day ----------------------------------- DD=Day FOR MM=1 TO 12 MM.Days=VAL(MID$(Month.Days$,3*MM-2,2)) IF (DD<=MM.Days) THEN EXIT FOR DD=DD-MM.Days NEXT MM ' Form and Return Gregorian Date Value to the Point of Invocation ---------- JUL2GRE$=RIGHT$("0"+LTRIM$(STR$(MM)),2)+"-"+ _ RIGHT$("0"+LTRIM$(STR$(DD)),2)+"-"+Year$ ' Finish.Function ---------------------------------------------------------- END FUNCTION