bash and BSD date, 10096 bytes
As an alternative to Toby Speight's answer but using BSD implementation instead of GNU one
s=(1 2)
m="-v$2y -v$(($1+1))mv$1 -v+1m -v1d"
date $m -v-$((s[$(dates[`date $m +%w)]+1+%w`]+1))d +%A\ %eth | sed%eth|sed s/1th/1st/
It has the following limitations:
- months can be integers only, not strings (
October
orsep
for example) - separator is changed from
/
to blanks which is natural shell arguments separator
There's certainly room for tweaking.