Thank you, Geoff
@Mike_Duglas sent me code below and it looks clean and easy to extend, also no 3rd-party
IsDate PROCEDURE (pInput) ! Declare Procedure
fmt STRING(10),DIM(5) ! 5 mostly used date formats
dtValidStart LONG,AUTO ! lowest valid date
dtValidEnd LONG,AUTO ! highest valid date
dtTest LONG,AUTO ! deformatted value
i LONG,AUTO !
CODE
fmt[1] = '@d17'
fmt[2] = '@d05'
fmt[3] = '@d05.'
fmt[4] = '@d06'
fmt[5] = '@d06.'
dtValidStart = DATE(1, 1, 1801)
dtValidEnd = DATE(1, 1, 3030)
!- loop thru each date format
LOOP i=1 TO MAXIMUM(fmt, 1)
!- try to deformat
dtTest = DEFORMAT(pInput, fmt[i])
IF (dtTest >= dtValidStart AND dtTest <= dtValidEnd) AND (pInput=FORMAT(dtTest, fmt[i]))
!- the date in date range and formatted date=input
!- valid date
RETURN TRUE
END
END
RETURN FALSE