Sem upload, 100% local, sem conta

Artigo

Durações ISO 8601: o que P1DT2H significa

Uma resposta da YouTube Data API diz que um vídeo dura PT4M13S. Um convite de calendário traz P15DT5H0M20S. Um servidor de diretório marca uma conta com 20260424174227.0Z, que parece relacionado mas é algo completamente diferente. Essas strings compactas seguem regras que vale a pena conhecer, porque lê-las errado transforma minutos em meses. Este é um passeio pelo formato de duração ISO 8601: o que as letras significam, onde o formato aparece, e sua grande sutileza, que uma duração escrita assim nem sempre é uma quantidade fixa de tempo.

P, T, e o que as letras significam

Uma duração ISO 8601 começa com P (período). Depois vêm os componentes de data, cada um um número seguido da sua letra de unidade: Y anos, M meses, W semanas, D dias. Um T separa a parte de data da parte de hora: H horas, M minutos, S segundos. Todo componente é opcional; escreve-se apenas o que é necessário. PT15M são 15 minutos, P1DT2H é um dia e duas horas, P3W são três semanas. O T não é decoração: M significa meses antes dele e minutos depois dele, então P1M é um mês enquanto PT1M é um minuto. O último componente presente pode carregar uma fração decimal, como em PT0.5S para meio segundo. E as unidades não se convertem sozinhas: PT90M é uma forma perfeitamente válida de escrever uma hora e meia.

Anatomia da duração ISO 8601 P3Y6M4DT12H30M5S: P abre o período, Y M D são unidades de data, T muda para a hora, H M S são unidades de hora

Onde você realmente encontra o formato

Essa sintaxe está discretamente em todo lugar. A YouTube Data API reporta a duração de cada vídeo como uma duração ISO 8601 (PT4M13S). O HTML aceita durações no atributo datetime do elemento time. Convites de calendário a usam: o padrão iCalendar (RFC 5545) escreve a duração de um evento como PT1H0M0S, embora exclua anos e meses de sua gramática. O xs:duration do XML Schema cobre a forma completa e até permite um sinal de menos inicial para durações negativas. Bibliotecas padrão a interpretam diretamente: o java.time lê strings P e T com Period.parse e Duration.parse, e a mesma divisão existe em muitas outras linguagens. Se você produz agendas, feeds ou APIs legíveis por máquina, esse formato é a língua franca para "quanto tempo dura".

Por que P1M não é um número fixo de segundos

PT15M são sempre 900 segundos. P1M não é: um mês dura 28, 29, 30 ou 31 dias dependendo de onde começa, então P1M só se torna concreto quando ancorado a uma data. Nem mesmo P1D tem garantia de ser 24 horas. Na União Europeia, os relógios avançam no domingo, 29 de março de 2026, então esse dia do calendário dura 23 horas: somar P1D (um dia do calendário) e somar PT24H (exatamente 24 horas) à mesma noite de sábado leva a instantes diferentes. É por isso que o java.time tem dois tipos, Period para unidades de calendário e Duration para segundos exatos, e por isso as bibliotecas de datas pedem uma data de referência antes de converter uma duração. Trate os componentes Y, M, W e D como aritmética de calendário, e apenas H, M e S como quantidades fixas de tempo.

Não é uma duração: 20260424174227.0Z

Uma string como 20260424174227.0Z parece que poderia pertencer à mesma família, mas é um timestamp, não uma duração, e também não é ISO 8601. É GeneralizedTime, um formato do ASN.1, a notação usada por diretórios LDAP e certificados X.509. Deve ser lida como campos de largura fixa: ano 2026, mês 04, dia 24, depois 17:42:27, uma fração opcional (.0), e Z para UTC. Você a encontra em atributos do Active Directory como whenCreated e whenChanged, em exportações LDAP, e dentro de certificados, onde o RFC 5280 exige GeneralizedTime para datas de validade a partir do ano 2050. O detalhe que a distingue da forma compacta do ISO 8601 é o T ausente: o ISO escreveria o mesmo instante como 20260424T174227Z.

A string GeneralizedTime 20260424174227.0Z decodificada campo por campo em 24 de abril de 2026, 17:42:27 UTC

Decodificando uma sem ler o padrão

Para uma string pontual, nosso conversor de duração ISO analisa qualquer duração P/T em seus componentes e seu total em segundos, e reconstrói a string a partir dos números que você digita. Quando o que você tem são dois horários em vez de uma string de duração (um turno que vai das 22:00 às 06:30, por exemplo), a calculadora de duração de tempo dá o tempo decorrido, incluindo intervalos que atravessam a meia-noite. Ambos funcionam inteiramente no seu navegador: nada do que você digita sai do seu dispositivo. E para uma leitura rápida sem nenhuma ferramenta, dois reflexos cobrem a maioria dos casos: procure o T para saber se um M significa meses ou minutos, e lembre-se de que tudo à esquerda do T é aritmética de calendário, não um número fixo de segundos.

Ferramentas neste artigo

Perguntas frequentes

PT1M é o mesmo que P1M?

Não. A letra M muda de significado conforme o separador T: P1M é um mês, PT1M é um minuto. Essa é a leitura errada mais comum do formato, e bugs de API já foram lançados por causa disso. Na dúvida, procure o T primeiro: tudo antes dele conta em anos, meses, semanas e dias; tudo depois dele conta em horas, minutos e segundos. Uma duração bem formada nunca tem unidades de hora antes do T nem unidades de data depois dele.

Como escrever 90 minutos como uma duração ISO 8601?

PT90M e PT1H30M são ambas válidas e descrevem a mesma quantidade de tempo. O ISO 8601 não obriga os componentes a ficarem dentro de suas faixas convencionais, então minutos acima de 59 ou horas acima de 23 são aceitáveis. Interpretadores aceitam qualquer uma das grafias; qual delas um sistema emite depende de ele normalizar ou não. Se você gera durações para pessoas lerem, PT1H30M é mais amigável; se compara durações em código, compare o total de segundos em vez das strings, justamente porque duas strings diferentes podem significar a mesma coisa.

Qual é a diferença entre uma duração e um intervalo?

Uma duração diz quanto tempo, sem posição no calendário: P3D são três dias, começando em qualquer lugar. Um intervalo ISO 8601 fixa uma duração a datas reais, escrito com uma barra: 2026-07-04T00:00:00Z/P3D significa os três dias a partir de 4 de julho de 2026, e um par início/fim como 2026-07-04/2026-07-07 expressa o mesmo intervalo. Também existem intervalos repetidos com um prefixo R: R5/2026-07-04T00:00:00Z/P1D significa cinco repetições diárias a partir daquele início. Intervalos resolvem a ambiguidade das unidades de calendário, já que P1M ancorado a uma data sempre tem um comprimento definido.

Fontes