Change the afternoon. Drop the nap (I am surprised he is asleep before midnight). Replace it with exercise, homework, tea, bath then bed at 7.30.

My 4 year old can take several hours to go to sleep. If he napped later than 2 (up by 2 )or for more than an hour after his second birthday he would have been awake until 11 or 12.