#!/bin/sh
# http://www.linuxjournal.com/article/11025?page=0,1
# https://crystalfaeries.net/posix/bin/day
# celeste@crystalfaeries.net DAY 2020-03-30 17:37:18+00:00
# NOTE: first execution shows search in time backwards,
# NOTE: we would like to also search forwards.

export LC_TIME=C

usage()
{
    cat <<!
USAGE:
    ${0##*/} WEEKDAY MONTH_NAME Day
    ${0##*/} WEEKDAY MONTH-DAY
    ${0##*/} WEEKDAY MONTH/DAY
!
}

if [ $# -ne 3 -a $# -ne 2 ]; then
    usage
    exit 1
fi
if [ $# -eq 3 ]; then
    # GNU `date' accepts "Sep 25 2008"
    fmt="$2 $3 %d"
else
    # And also accepts "2011-9-25" or "9/25/2011"
    case "$2" in
        *-*)
            fmt="%d-$2"
            ;;
        */*)
            fmt="$2/%d"
            ;;
        *)
            echo "Uknown date: $2"
            usage
            exit 1
            ;;
    esac
fi

case $(echo $1 | tr '[:upper:]' '[:lower:]' | cut -c1-3) in
    mon) weekday=1 ;;
    tue) weekday=2 ;;
    wed) weekday=3 ;;
    thu) weekday=4 ;;
    fri) weekday=5 ;;
    sat) weekday=6 ;;
    sun) weekday=7 ;;
    *)
        echo "$1: Unknown weekday"
        exit 1
        ;;
esac

MY_DATE_FMT="%Y/%m/%d"
MY_WDAY_FMT="%A"

MAX_TRY=128

y0=$(date +%Y)	# start with this year
i=0		# and work backwards in time
found=0
while [ $i -lt $MAX_TRY ]; do
#   y=$((y0 - i))
    y=$((y0 + i))
    str=$(printf "$fmt" $y)
    if ! j=$(date -d "$str" +%u); then
        # `date' will complain, so I keep quiet
        exit 1
    fi
    if [ $j -eq $weekday ]; then
        echo $(date -d "$str" +$MY_DATE_FMT) is \
            $(date -d "$str" +$MY_WDAY_FMT)
        found=1
    fi
    i=$((i + 1))
done

test $found -eq 0 && exit 1
exit 0

celeste@fey:/usr/local/bin$ day fri june 23
2017/06/23 is Friday
2006/06/23 is Friday
2000/06/23 is Friday
1995/06/23 is Friday
1989/06/23 is Friday
1978/06/23 is Friday
1972/06/23 is Friday
1967/06/23 is Friday
1961/06/23 is Friday
1950/06/23 is Friday
1944/06/23 is Friday
1939/06/23 is Friday
1933/06/23 is Friday
1922/06/23 is Friday
1916/06/23 is Friday
1911/06/23 is Friday
1905/06/23 is Friday
date: invalid date 'june 23 1901'

