Home / SRT Subtitle Timing Shifter
SRT Subtitle Timing Shifter
Paste or upload .srt subtitle file contents, enter a shift amount in seconds (positive or negative, fractional allowed), and get back every timestamp shifted correctly — with rollover handled and a floor at 00:00:00,000 — ready to download.
How the shift works
Every timestamp in an .srt file follows the exact pattern HH:MM:SS,mmm (hours, minutes, seconds, milliseconds). This tool converts each timestamp to a single millisecond count, adds your shift amount (converted to milliseconds and rounded), clamps the result so it never goes below zero, then converts back to HH:MM:SS,mmm with correct rollover across seconds, minutes and hours in both directions. Sequence numbers and subtitle text are left untouched — only the timing lines change.
What this can't do
This shifts every timestamp by the same fixed amount. It won't fix subtitles that drift out of sync gradually over a long file (where different points in the file need different amounts of correction) or resync subtitles to a re-edited version of the video with cuts added or removed — for those, you need timeline-aware resync tools, not a uniform shift.
Frequently asked questions
What happens if a shift would push a timestamp before zero?
The tool clamps that timestamp to 00:00:00,000 instead of allowing a negative time, since negative timestamps aren't valid in the .srt format and would break most players.
Can I use a fractional shift like -1.5 seconds?
Yes — the shift amount accepts decimals down to the millisecond, so -1.5 shifts every timestamp 1500 milliseconds earlier, with the same rollover and clamping rules applied.
Does this tool upload my subtitle file anywhere?
No — parsing, shifting and generating the corrected file all happen in your browser with plain JavaScript. Nothing you paste or upload is sent to a server.
Will this work on .vtt or other subtitle formats?
This tool is built specifically for the .srt timestamp format (HH:MM:SS,mmm --> HH:MM:SS,mmm). WebVTT uses a similar but slightly different format (periods instead of commas, optional header) and isn't guaranteed to parse correctly here.