is_date() #@ Return success if argument is a valid date
{ #@ USAGE: is_date STRING ...
#@ Required functions: days_in_month(), is_leap_year()
local year month day junk dim jgmonth=175209 ym
local j2g='Invalid date (Julian to Gregorian changeover)'
read year month day junk <<< "${*//[!0-9]/ }"
if [[ $year =~ ^[0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9]$ ]]
then
day=${year: -2}
month=${year:4:2}
year=${year:0:4}
fi
day=${day#0}
month=${month#0}
printf -v ym "%d%02d" "$year" "$month"
if (( ym == jgmonth )) && (( day > 2 )) && (( day < 14 ))
then
err 1 "$j2g" || return
fi
(( month < 1 )) || (( month > 12 )) ||
(( day < 1 )) || (( day > 31 )) && return 1
days_in_month dim "$month" "$year"
(( day <= dim )) && printf -v is_date %d-%02d-%02d "$year" "$month" "$day"
}