Regex 24-hour time (HH:MM:SS)
The HTML standard (WHATWG) defines the 'valid time string': two hour digits from 00 to 23, a colon, two minute digits from 00 to 59, then optionally a colon, two second digits from 00 to 59 and, after the seconds, a dot and 1 to 3 fraction digits. Seconds 60 and 61 are excluded. The attempts I read differ: validator.js and jQuery Validation accept an hour without a leading zero ('9:05'), jQuery Validation accepts even '7:30:15' but not '14:30:15.5', and ajv-formats' pattern requires seconds and an optional offset without bounding the values ('99:99:99' passes, the check is done afterwards in code). Here's a pattern following the HTML standard, compared against those attempts.
/^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9](?:\.[0-9]{1,3})?)?$/passes 28/28 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js (isTime, hour24) — zéro initial facultatif : « 9:05 » passe ; secondes absentes du mode par défaut (« 07:45:30 » refusé) | ^([01]?[0-9]|2[0-3]):([0-5][0-9])$ | 22 / 28 | safe |
| jquery-validation (time) — « 9:05 » et « 7:30:15 » acceptés (heure à 1 chiffre) ; fraction des secondes refusée | ^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$ | 24 / 28 | safe |
| ajv-formats (TIME) — forme seulement, valeurs non bornées (« 99:99:99 » passe, bornes contrôlées ensuite en code) ; secondes obligatoires : « 12:30 » refusé | ^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$ | 20 / 28 | safe |
Implementation
const re = new RegExp("^(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9](?:\\.[0-9]{1,3})?)?$", "");
re.test(input);Limits
- Valide seulement la FORME 24 h. « 24:00 » (admis par ISO 8601 pour la fin d'une journée) et les secondes intercalaires (« 23:59:60 ») sont refusés, comme dans la norme HTML.
- Ni fuseau horaire (« Z », « +02:00 ») ni date : pour un instant complet, voir la fiche timestamp-iso8601. Le zéro initial est obligatoire.
- Une heure ne dit rien de son existence locale : certaines heures n'existent pas (passage à l'heure d'été) ou existent deux fois (retour à l'heure d'hiver).