How SRT Timestamps Work
HH:MM:SS,mmm explained, with the rules that trip people up and how to convert from other formats.
Updated 2026-10-26
Every SRT cue has a timing line in this exact form:
00:01:02,500 --> 00:01:05,250
Reading a timestamp
| Part | Meaning | Rule |
|---|---|---|
00 |
hours | two or more digits |
01 |
minutes | two digits, 00–59 |
02 |
seconds | two digits, 00–59 |
500 |
milliseconds | exactly three digits |
The separator before milliseconds is a comma. This is the single most common SRT error: WebVTT uses a full stop, and files converted carelessly end up with the wrong one.
The arrow
Start and end are separated by a space, two hyphens, a greater-than sign and a space: -->. Some players tolerate variations; many don't.
Start must come before end
A cue whose end time is equal to or earlier than its start time is invalid. Each cue's start should also be at or after the previous cue's start.
Converting from seconds
If a tool gives you times in seconds (e.g. 62.5), convert like this:
function toSrt(ms) {
const h = Math.floor(ms / 3600000);
const m = Math.floor((ms % 3600000) / 60000);
const s = Math.floor((ms % 60000) / 1000);
const f = ms % 1000;
const p = (n, w = 2) => String(n).padStart(w, "0");
return `${p(h)}:${p(m)}:${p(s)},${p(f, 3)}`;
}
toSrt(62500); // "00:01:02,500"
Frame-based timecodes
Editing software often shows timecode as HH:MM:SS:FF (frames). To convert, divide the frame number by the frame rate: at 25 fps, frame 12 is 480 ms. Using the wrong frame rate causes gradual drift — subtitles that start correct and get progressively later.