Без завантаження, 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, прив'язаний до дати, завжди має одну визначену довжину.

Джерела