It’s free, subtitle editor in Java actually, but I’m Mac. You can get it at jubler.org.
Here’s two useful tools for me:
1. Shift Time

If the sub start to soon or to late, use this tool. You can add / subtract how many second or minute you need. But if you watching movie with vlc, you can do this easily by press j button on keyboard for adding subtitle delay and h for subtracting subtitle delay. Keyword: delay.
2. Recode

You need this if the sub really don’t sync with the movie at all. It keep appear faster or slower even after you already shift it. It’s happened because the movie have different frame per second (fps) rate with the movie which synced with the subtitle. Different version or encode setting. It can start early but finish late. Movie runtime 1 hour, but sub runtime 1 hour 15 minutes for example.
To subtract sub runtime you need to make fps bigger, same with the opposite. Tips, watch the movie first, find the start time of first sentence and last sentence, then recode and shift the sub to match it with the movie. Keyword: runtime.
Make sure the sub just need delay or just out of sync, not a srt file with time and text on it. You’ll waste your time.