Без качване, 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 са единици за час

Къде наистина срещате този формат

Този синтаксис се среща тихомълком навсякъде. API на YouTube Data съобщава дължината на всяко видео като продължителност по 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 8601 продължителност разчленява всяка продължителност във формат P/T на нейните компоненти и общата ѝ стойност в секунди, и изгражда низа обратно от числата, които въвеждате. Когато разполагате с два часа по часовника, а не с низ за продължителност (например смяна от 22:00 до 06:30), калкулаторът за продължителност на времето дава изминалото време, включително интервалите, преминаващи през полунощ. И двата работят изцяло във вашия браузър: това, което въвеждате, никога не напуска устройството ви. А за бързо четене без никакъв инструмент, два рефлекса покриват повечето случаи: потърсете T, за да разберете дали M означава месеци или минути, и запомнете, че всичко вляво от T е календарна аритметика, а не фиксиран брой секунди.

Инструменти от тази статия

Често задавани въпроси

Еднакви ли са PT1M и P1M?

Не. Буквата M сменя значението си от двете страни на разделителя T: P1M е един месец, PT1M е една минута. Това е най-честото погрешно тълкуване на този формат и заради него са излизали грешки в API. При съмнение първо потърсете 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, обвързан с дата, винаги има една определена дължина.

Източници