Short Date into English Long Date
Python 3.6, 137 129 bytes
from datetime import*
def f(k):g=[*map(int,k.split('-'))];n=g[2];return f"{date(*g):%-d{'tsnrhtdd'[n%5*(n^15>4>n%10)::4]} %B %Y}"
Try it online!
Python 3.6, 154 bytes
from datetime import*
s=[*map(int,input().split('-'))]
b=s[2]
print(date(*s).strftime(f"%-d{'th'if(3<b<21)+(23<b<31)else('st','nd','rd')[b%10-1]} %B %Y"))
Try it online! (Set input stream and then run.)
Thanks to good suggestions from commenters below.
JavaScript (ES6), 142 140 bytes
Outputs NaNth Invalid Date
for invalid dates.
The code for ordinal numbers was adapted from this answer.
d=>`${s=(D=new Date(d)).getDate()+''}${[,'st','nd','rd'][s.match`1?.$`]||'th'} `+D.toLocaleDateString('en-GB',{month:'long',year:'numeric'})
f=
d=>`${s=(D=new Date(d)).getDate()+''}${[,'st','nd','rd'][s.match`1?.$`]||'th'} `+D.toLocaleDateString('en-GB',{month:'long',year:'numeric'})
console.log(
f('2005-12-3'),
f('1980-05-12'),
f('2005-12-3'),
f('150-4-21'),
f('2011-2-29'),
f('1999-10-35')
)