Date functions: jday


jday() #@ Return day in year for given date
{      #@ USAGE: jday DATE [VAR]
       #@ Required functions: is_date() is_leap_year() is_var() today() vshow()
  local var _y _m _d junk val ymd=$1 _jday
  local m1jday=(0 0 31 59 90 120 151 181 212 243 273 304 334)
  if (( $# == 0 )) || is_var "$1"
  then
    today ymd
  elif is_date "$ymd"
  then
    is_var "$2"
  fi
  read _y _m _d junk <<< "${ymd//[!0-9]/ }"
  is_date "$_y-$_m-$_d"|| err 1 "Invalid date: $ymd" || return
  _m=${_m#0}
  _d=${_d#0}
  _jday=$(( m1jday[_m] + _d ))
  if (( _m > 2 )) && is_leap_year "$_y"
  then
    (( ++_jday ))
  fi
  is_var "$var" && printf -v "$var" %s "$_jday" || vshow _jday
}