Um, Win95, [no server], PHP4.3; works fine here. Bounced my system clock around the year for a bit trying to catch it out, but no; a whole year works out right.
Thought for a few seconds that it might be a Daylight Saving issue , but no; that wouldn't be it - it's what I would suspect it if the code assumed all days were 86400 seconds long. Say daylight saving began at 2am on the morning of the 29th. Midnight on the start of that day would be the 29th; 24 hours later it would still be the 29th (11pm, in fact).
But no. That's not the problem. On the one hand, the dates given would have gone 28, 29, 29, 30, 31; on the other hand, the code isn't making that 86400-seconds-per-day assumption; and on the gripping hand, your local territory and system might not even be starting Daylight Saving on that date.
mktime(0,0,0,3,28+2,2003) should display as March 30...
All in all, odd indeed.
Incidentally, what does date("l j F, Y", mktime(0,0,0,3,30,2003)) produce? Or date("l j F, Y", mktime(3,3,3,3,30,2003)) for that matter?