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
}