Regex de hora (HH:MM e HH:MM:SS)
Regex de hora no formato 24 horas, HH:MM ou HH:MM:SS, com horas de 00 a 23 e minutos e segundos de 00 a 59. Não trata AM e PM.
O padrão
(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?
Flags: nenhuma. Sem âncoras: para validar um campo inteiro use ^(?:padrão)$.
Teste na hora
| Linha | Resultado |
|---|
Tudo roda no seu navegador; nada do que você digita é enviado.
Exemplos
Casam
08:3023:59:5900:0012:45:07
Não casam
24:008:3012:6012:512:30:61
Como funciona, por partes
(?:[01]\d|2[0-3]): Horas: de 00 a 19 pela primeira alternativa e de 20 a 23 pela segunda. Isso recusa 24 e valores maiores.:: Separador literal de dois pontos entre horas e minutos.[0-5]\d: Minutos: primeiro dígito de 0 a 5 e segundo dígito qualquer, ou seja, de 00 a 59.(?::[0-5]\d)?: Segundos opcionais, com a mesma regra dos minutos. O grupo todo é facultativo, então HH:MM e HH:MM:SS são aceitos.Duas casas: O padrão exige dois dígitos nas horas. Para aceitar 8:30, troque o início por (?:[01]?\d|2[0-3]).
Armadilhas
- Em relógio de 24 horas, 24:00 às vezes aparece como fim do dia. O padrão o recusa de propósito; trate esse caso à parte se o seu sistema o produz.
- Duração não é hora do dia. Um total de 38:15 horas trabalhadas é válido como duração, mas este regex o recusa. Para somar horas, use um padrão sem limite no campo de horas.
- Fuso e horário de verão não existem para o regex. O texto 02:30 pode ser inexistente em dia de mudança de horário; isso só se resolve com biblioteca de datas.
- Formatos de 12 horas, como 8:30 PM, exigem outro padrão. Este não reconhece AM nem PM.
Código pronto
JavaScript
const re = new RegExp("^(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?)$");
console.log(re.test(texto.trim()));
Python
import re re_hora = re.compile(r"(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?") print(bool(re_hora.fullmatch(texto.strip())))
C#
using System.Text.RegularExpressions; var re = new Regex(@"^(?:(?:[01][0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?)\z"); bool ok = re.IsMatch(texto.Trim());
Perguntas frequentes
Como aceitar hora sem zero à esquerda?
Troque o início do padrão por (?:[01]?\d|2[0-3]). Com isso, 8:30 e 08:30 passam. Se for guardar, normalize para duas casas.
Posso usar ponto em vez de dois pontos?
Basta trocar o separador por [:.]. Cuidado: 12.30 também parece um número decimal, então isso só faz sentido quando o campo é claramente de hora.
Esse regex serve para somar horas?
Serve para conferir o formato de cada hora. A soma é outra tarefa: converta cada valor em minutos, some e converta de volta, como faz a ferramenta de soma de horas.
E se a hora vier com letras, como 8h30?
O padrão não reconhece esse formato, e de propósito: misturar letras e números abre a porta para ambiguidades. Se a sua origem usa 8h30, crie um passo de normalização que troque o h por dois pontos e complete o zero à esquerda, e só então teste. Assim a regra de validação continua curta e fácil de manter, e a conversão fica em um lugar só, onde pode ser testada com exemplos próprios.