Date functions: is_date


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"
}