Без загрузки, 100% локально, без аккаунта

Статья

Периоды ISO 8601: что означает P1DT2H

Ответ API YouTube сообщает, что видео длится PT4M13S. Приглашение в календаре содержит значение P15DT5H0M20S. Некий сервер каталогов ставит на аккаунте отметку времени 20260424174227.0Z, которая выглядит похожей, но на самом деле относится совсем к другой вещи. Эти компактные строки подчиняются правилам, которые стоит знать, потому что неверное чтение превращает минуты в месяцы. Это обзор формата периодов ISO 8601: что означают буквы, где этот формат встречается и в чём его главная тонкость, а именно в том, что период, записанный таким образом, не всегда представляет собой фиксированный отрезок времени.

P, T и что означают буквы

Период ISO 8601 начинается с P (period). Затем идут компоненты даты, каждый из которых является числом с буквой единицы измерения после него: Y это годы, M это месяцы, W это недели, D это дни. Буква T отделяет часть даты от части времени: H это часы, M это минуты, S это секунды. Каждый компонент необязателен; вы пишете только то, что нужно. PT15M это 15 минут, P1DT2H это один день и два часа, P3W это три недели. Буква T не украшение: M означает месяцы до неё и минуты после, поэтому P1M это один месяц, а PT1M это одна минута. Последний из присутствующих компонентов может нести дробную часть, как в PT0.5S для половины секунды. И единицы не переносятся друг в друга сами по себе: PT90M это вполне допустимый способ записать полтора часа.

Анатомия периода ISO 8601 P3Y6M4DT12H30M5S: P начинает период, Y M D это единицы даты, T переключает на время, H M S это единицы времени

Где вы на самом деле встречаете этот формат

Этот синтаксис незаметно встречается повсюду. YouTube Data API сообщает длину каждого видео как период ISO 8601 (PT4M13S). HTML принимает периоды в атрибуте datetime элемента time. Приглашения в календаре тоже его используют: стандарт iCalendar (RFC 5545) записывает длину события как PT1H0M0S, хотя исключает годы и месяцы из своей грамматики. xs:duration в XML Schema охватывает полную форму и даже допускает знак минус в начале для отрицательных периодов. Стандартные библиотеки разбирают его напрямую: java.time читает строки P и T через Period.parse и Duration.parse, и такое же разделение существует во многих других языках. Если вы создаёте машиночитаемые расписания, ленты или API, этот формат служит общим языком для ответа на вопрос "как долго".

Почему P1M не является фиксированным числом секунд

PT15M всегда равно 900 секундам. P1M нет: месяц длится 28, 29, 30 или 31 день в зависимости от того, где он начинается, поэтому P1M становится конкретным значением только после привязки к дате. Даже P1D не гарантированно равен 24 часам. В Европейском союзе часы переводятся вперёд в воскресенье, 29 марта 2026 года, поэтому этот календарный день длится всего 23 часа: прибавление P1D (одного календарного дня) и прибавление PT24H (ровно 24 часов) к одному и тому же субботнему вечеру приводит к разным моментам времени. Именно поэтому в java.time есть два типа, Period для календарных единиц и Duration для точных секунд, и именно поэтому библиотеки работы с датами требуют опорную дату перед преобразованием периода. Относитесь к компонентам Y, M, W и D как к календарной арифметике, и только к H, M и S как к фиксированным отрезкам времени.

Не период: 20260424174227.0Z

Строка вроде 20260424174227.0Z может выглядеть так, будто относится к тому же семейству, но на самом деле это отметка времени, а не период, и вообще не ISO 8601. Это GeneralizedTime, формат из ASN.1, нотация, которую используют каталоги LDAP и сертификаты X.509. Читайте её как поля фиксированной ширины: год 2026, месяц 04, день 24, затем 17:42:27, необязательная дробная часть (.0) и Z для UTC. Вы встретите её в атрибутах Active Directory, таких как whenCreated и whenChanged, в экспортах LDAP и внутри сертификатов, где RFC 5280 требует GeneralizedTime для дат действия начиная с 2050 года. Признак, который отличает её от компактной формы ISO 8601, это отсутствие буквы T: в ISO тот же момент записали бы как 20260424T174227Z.

Строка GeneralizedTime 20260424174227.0Z, расшифрованная по полям, даёт 24 апреля 2026 года, 17:42:27 UTC

Как расшифровать строку, не читая спецификацию

Для разовой строки наш конвертер периодов ISO разбирает любой период P/T на компоненты и суммарное значение в секундах, а также собирает строку обратно из введённых вами чисел. Когда у вас есть два момента времени, а не строка периода (например, смена с 22:00 до 06:30), калькулятор продолжительности времени вычисляет прошедшее время, включая интервалы, переходящие через полночь. Оба инструмента работают полностью в вашем браузере: то, что вы вводите, никогда не покидает ваше устройство. А для быстрого чтения без каких-либо инструментов достаточно двух приёмов: найти T, чтобы понять, означает ли M месяцы или минуты, и помнить, что всё слева от T это календарная арифметика, а не фиксированное число секунд.

Инструменты из этой статьи

Частые вопросы

PT1M это то же самое, что и P1M?

Нет. Буква M меняет значение в зависимости от того, по какую сторону от разделителя T она находится: P1M это один месяц, PT1M это одна минута. Это самое распространённое неверное прочтение данного формата, и из-за него в прод выходили ошибки API. Если сомневаетесь, сначала найдите T: всё до неё считается в годах, месяцах, неделях и днях, всё после неё считается в часах, минутах и секундах. У корректно составленного периода единицы времени никогда не стоят перед T, а единицы даты никогда не стоят после T.

Как записать 90 минут в виде периода ISO 8601?

PT90M и PT1H30M оба допустимы и описывают одно и то же количество времени. ISO 8601 не заставляет компоненты укладываться в их обычные диапазоны, поэтому минуты больше 59 или часы больше 23 вполне нормальны. Парсеры принимают оба варианта записи; какой из них выдаёт система, зависит от того, нормализует ли она значение. Если вы создаёте периоды для чтения людьми, PT1H30M удобнее; если вы сравниваете периоды в коде, сравнивайте их суммарные секунды, а не сами строки, именно потому что две разные строки могут означать одно и то же.

В чём разница между периодом и интервалом?

Период указывает, как долго, без привязки к позиции на календаре: P3D это три дня, начиная с любой точки. Интервал ISO 8601 закрепляет период за реальными датами и записывается через косую черту: 2026-07-04T00:00:00Z/P3D означает три дня, начинающиеся 4 июля 2026 года, а пара начало/конец вроде 2026-07-04/2026-07-07 выражает тот же отрезок. Существуют и повторяющиеся интервалы с префиксом R: R5/2026-07-04T00:00:00Z/P1D означает пять ежедневных повторений с этой начальной точки. Интервалы устраняют неоднозначность календарных единиц, поскольку P1M, привязанный к дате, всегда имеет одну определённую длину.

Источники