Validador de Data ISO/Padrão
Verifica se uma data está em formato ISO 8601 ou formatos comuns (YYYY-MM-DD, DD/MM/YYYY, MM/DD/YYYY). Detecta automaticamente o formato.
Variantes do formato ISO 8601: basico, estendido, ordinal e por semana
ISO 8601 nao e um unico formato — e uma familia de representacoes para datas e horarios. A forma famosa YYYY-MM-DD e so a ponta: o padrao tambem define a versao basica (sem separadores) e a estendida (com separadores), datas ordinais que contam o dia desde 1 de janeiro, datas por semana ancoradas na segunda-feira e date-time com fracoes de segundo e offset de fuso. Este validador foca nas variantes de formato: a forma textual exata que a string precisa ter para ser aceita por RFC 3339, W3CDTF, JSON Schema ou a futura Temporal API.
Uma checagem so de formato responde a uma pergunta: essa string esta sintaticamente correta? A validade semantica (existe 30 de fevereiro?) e uma checagem separada que envolve regras de ano bissexto e comprimento de mes.
Seis perfis que voce vai encontrar
- RFC 3339 (timestamps de internet) —
YYYY-MM-DDTHH:MM:SS+HH:MM. Subconjunto estrito de ISO 8601 usado por JSON, OAuth, cabecalhos HTTP de data. - W3CDTF (perfil web) — subconjunto ainda mais estreito do RFC 3339, adotado por Atom, RSS e sitemap.xml.
- Formato estendido com milissegundos —
YYYY-MM-DDTHH:MM:SS.sss+HH:MM. Saida padrao deDate.prototype.toISOString(). - Formato basico (sem separadores) —
YYYYMMDDTHHMMSS+HHMM. Usado em nomes de arquivo e EDI antigo. - Data ordinal —
YYYY-DDD, ex.:2024-300significa o dia 300 de 2024 (26 de outubro). Comum em aviacao e astronomia. - Data por semana —
YYYY-W##-D, ex.:2024-W45-3e a quarta-feira da semana ISO 45. Usado em varejo e folha de pagamento.
Um regex de validacao hardcore
Um regex que cobre RFC 3339 e o formato estendido de uma vez:
/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?)?$/
Ele aceita 2024-03-15, 2024-03-15T10:30:00, 2024-03-15T10:30:00.123Z, 2024-03-15T10:30:00-03:00. Rejeita 2024/03/15, 15-03-2024 e zeros a esquerda faltando. Para ordinal e por semana, precisa adicionar alternativas: \d{4}-\d{3} e \d{4}-W\d{2}-\d.
Casos limite semanticos que o regex nao pega
- 29 de fevereiro em ano bissexto — so vale se
ano % 4 == 0 && (ano % 100 != 0 || ano % 400 == 0). Assim, 2000 sim, 1900 nao, 2024 sim, 2100 nao. - Dias por mes — 31 em jan/mar/mai/jul/ago/out/dez, 30 em abr/jun/set/nov, 28-29 em fevereiro.
- Hora 0-23 — a revisao ISO 8601:2019 acabou com o caso especial
24:00:00para meia-noite, que versoes antigas permitiam. - Segundo bissexto —
23:59:60Zno ultimo dia de junho ou dezembro e um leap second legal pelo IERS, mas a maioria dos parsers rejeita. - Timezone Z — equivale a
+00:00(UTC).
Um validador realmente estrito combina regex (formato) com logica de calendario (semantica). Apps brasileiros ganham uma simplificacao: BRT e -03:00 o ano inteiro porque o Brasil aboliu o horario de verao em 2019.
Bibliotecas estritas vs o Date permissivo
O new Date(str) do JavaScript e propositalmente flexivel: chama Date.parse(), que aceita varias strings nao-ISO ("March 15 2024", "2024/03/15") com comportamento dependente de implementacao. Para entrada nao confiavel, use um parser estrito:
- Day.js —
dayjs(str, 'YYYY-MM-DDTHH:mm:ss', true), o terceiro argumento liga o modo estrito. - Luxon —
DateTime.fromISO(str, { setZone: true }).isValid. - date-fns —
parseISO(str)+isValid()para um parse so ISO. - Temporal API —
Temporal.PlainDate.from(str)lanca em entrada invalida; embrulhe num try/catch.
Formatos de exibicao vs formatos de armazenamento
ISO 8601 e a escolha certa para armazenar e transportar — ordenavel como texto, sem locale, legivel por maquina. Para exibir a humanos, use formato de locale: DD/MM/YYYY no Brasil, MM/DD/YYYY nos EUA, YYYY/MM/DD no Japao. A regra e universal: guarde ISO, renderize com Intl.DateTimeFormat ou sua lib de i18n. Misturar as duas coisas e a origem da maioria dos bugs de data em producao.
FAQ
O separador T e obrigatorio? No RFC 3339, sim — data e hora devem ser unidas pelo literal T (ou, por pedido dos humanos, um espaco). O ISO 8601 puro permite espaco; a maioria das APIs rejeita.
Z e valido? Sim — Z (Zulu) significa UTC e equivale a +00:00. RFC 3339 prefere por ser mais curto.
Data por semana e usada de verdade? Rara em APIs, mas padrao em varejo, folha de pagamento e calendarios ISO. 2024-W01-1 e a segunda-feira da primeira semana ISO de 2024 (que pode cair em dezembro de 2023).
Por que meu regex aceita 2024-02-30? Porque regex valida so formato. Validade de calendario precisa de funcao de calendario. Use uma biblioteca ou faca check por comprimento de mes.
ISO 8601 suporta datas antes de Cristo? Sim, com sinal opcional: -0001-01-01 e o ano 1 a.C. (calendario gregoriano proleptico). A maioria dos parsers nao implementa.
Ferramentas Relacionadas
Validador de Data ISO 8601
Confere se uma string é uma data/hora ISO 8601 válida (incluindo timezone) e mostra os componentes detectados.
Validador ISO 8601 (Tempo, estrito)
Valide estritamente uma duração no formato ISO 8601 (como P1Y2M10DT2H30M). Útil para APIs, agendamentos, vídeos e qualquer campo que use o padrão de duração ISO.
Validador de Marco Temporal (ISO 8601)
Valida formatos ISO 8601 de timestamp completo: YYYY-MM-DDTHH:MM:SS[.fff]Z|±HH:MM. Detecta UTC, offsets e milissegundos.