Date functions: numdate


numdate() #@ Convert day number to calendar date
{          #@ USAGE: numdate DAYNUM [VAR]
  local _day _mnth _yr _cent base=-306 _j2gstart=639786
  local _dnum=$1 _var=$2 _d400y=146097 numdate
  case $_dnum in ""|*[!0-9]*) return 1 ;; esac
  (( _dnum >= _j2gstart )) && _dnum=$((_dnum + 11))
  _day=$(( _dnum - base ))
  _cent=$(( (4 * _day - 1) / _d400y))
  _day=$(( _day + _cent - _cent/4))
  _yr=$(( (4 * _day - 1) / 1461))
  _day=$(( _day - (1461 * _yr) / 4))
  _mnth=$(( (10 * _day - 5) / 306))
  _day=$(( _day - (306 * _mnth + 5) / 10))
  _mnth=$(( _mnth + 2))
  _yr=$(( _yr + _mnth/12))
  _mnth=$(( _mnth % 12 + 1))
  printf -v numdate '%d-%02d-%02d' "$_yr" "$_mnth" "$_day"
  is_var "$_var" && printf -v "$_var" %s "$numdate" || printf '%s\n' "$numdate"
}