E.C.
I know it sounds contrary to what you would think, but my son and daughter both always sleep better when they go to bed earlier. They are both always in bed by 7 p.m. I discovered when my son was just a few months old that this works because I put him to bed a little early one night and he slept through the night for the first time! Worked ever since. Any nights that he has to go to bed later for any reason, he usually wakes up earlier in the morning and is cranky all day. It is tough when you are working, but it is worth the peace to get them to sleep earlier! There are some days it feels like I barely got home and we are already starting bedtime.
Try to keep your bedtime routine consistent and don't argue. I know it is hard -- I am dealing with a resistant four year old right now too. I won't let myself get into it with him though. When he starts to act up, whine, etc. I say one (nothing else, just one), if it continues I say two, etc. He knows now that if I get to three there is a consequence which is normally a time out but sometimes (like at bedtime) when I get to two I will state what the consequence will be when I get to three and that usually stops it. For example, after I say two: "If I have to say three, you go to bed right this minute without stories." Our favorite part of the day is bedtime stories and his acting up time is usually in the bathroom just before bed (potty, teeth brushing, etc.) so that consequence usually works like a charm. If you do say three though you have to stick with the consequence whether you want to or not or it will never work again.
Another line that works really well on my son to stop the whining: "You must be really tired. You only sound like that when you are tired. Do you need to go to bed now?" Stops the whining in a pinch. And now when he gets hurt or is whining for any reason, he comes to me and says "I need to go to bed!"
Good luck and I share your pain!
E.