Ingen uppladdning, 100% lokalt, inget konto

Artikel

ISO 8601-varaktigheter: vad P1DT2H betyder

Ett svar från YouTube Data API säger att en video varar PT4M13S. En kalenderinbjudan bär P15DT5H0M20S. En katalogserver tidsstämplar ett konto med 20260424174227.0Z, som ser besläktat ut men är något helt annat. Dessa kompakta strängar följer regler som är värda att känna till, eftersom en felläsning gör om minuter till månader. Det här är en genomgång av ISO 8601-formatet för varaktighet: vad bokstäverna betyder, var formatet dyker upp, och dess stora finess, nämligen att en varaktighet skriven på detta sätt inte alltid är en fast mängd tid.

P, T och vad bokstäverna betyder

En ISO 8601-varaktighet börjar med P (period). Sedan kommer datumkomponenterna, var och en ett tal följt av dess enhetsbokstav: Y år, M månader, W veckor, D dagar. Ett T skiljer datumdelen från tidsdelen: H timmar, M minuter, S sekunder. Varje komponent är valfri; man skriver bara det man behöver. PT15M är 15 minuter, P1DT2H är en dag och två timmar, P3W är tre veckor. T är ingen utsmyckning: M betyder månader före det och minuter efter det, så P1M är en månad medan PT1M är en minut. Den sista komponenten som finns med får bära ett decimaltal, som i PT0.5S för en halv sekund. Och enheterna växlar inte om sig själva: PT90M är ett fullt giltigt sätt att skriva en och en halv timme.

Uppbyggnaden av ISO 8601-varaktigheten P3Y6M4DT12H30M5S: P öppnar perioden, Y M D är datumenheter, T växlar till tiden, H M S är tidsenheter

Var man faktiskt stöter på formatet

Den här syntaxen finns tyst överallt. YouTube Data API rapporterar varje videolängd som en ISO 8601-varaktighet (PT4M13S). HTML accepterar varaktigheter i datetime-attributet på time-elementet. Kalenderinbjudningar använder det: iCalendar-standarden (RFC 5545) skriver händelselängder som PT1H0M0S, även om den utelämnar år och månader ur sin grammatik. xs:duration i XML Schema täcker den fullständiga formen och tillåter till och med ett inledande minustecken för negativa varaktigheter. Standardbibliotek tolkar det direkt: java.time läser P- och T-strängar med Period.parse och Duration.parse, och samma uppdelning finns i många andra språk. Producerar du maskinläsbara scheman, flöden eller API:er är det här formatet det gemensamma språket för "hur länge".

Varför P1M inte är ett fast antal sekunder

PT15M är alltid 900 sekunder. P1M är det inte: en månad varar 28, 29, 30 eller 31 dagar beroende på var den börjar, så P1M blir konkret först när den förankras till ett datum. Inte ens P1D är garanterat 24 timmar. Inom EU ställs klockorna fram söndagen den 29 mars 2026, så den kalenderdagen varar bara 23 timmar: att lägga till P1D (en kalenderdag) och att lägga till PT24H (exakt 24 timmar) till samma lördagskväll hamnar på olika tidpunkter. Det är därför java.time har två typer, Period för kalenderenheter och Duration för exakta sekunder, och därför datumbibliotek kräver ett referensdatum innan de omvandlar en varaktighet. Behandla komponenterna Y, M, W och D som kalenderaritmetik, och endast H, M och S som fasta tidsmängder.

Ingen varaktighet: 20260424174227.0Z

En sträng som 20260424174227.0Z ser ut som att den kan tillhöra samma familj, men det är en tidsstämpel, inte en varaktighet, och inte heller ISO 8601. Det är GeneralizedTime, ett format från ASN.1, notationen som används av LDAP-kataloger och X.509-certifikat. Läs den som fält med fast bredd: år 2026, månad 04, dag 24, sedan 17:42:27, en valfri bråkdel (.0), och Z för UTC. Du stöter på den i Active Directory-attribut som whenCreated och whenChanged, i LDAP-exporter, och i certifikat, där RFC 5280 kräver GeneralizedTime för giltighetsdatum från och med år 2050. Det som skiljer den från ISO 8601:s kompakta form är det saknade T:et: ISO skulle skriva samma tidpunkt som 20260424T174227Z.

GeneralizedTime-strängen 20260424174227.0Z avkodad fält för fält till 24 april 2026, 17:42:27 UTC

Att avkoda en utan att läsa specifikationen

För en enstaka sträng bryter vår ISO-varaktighetsomvandlare ned vilken P/T-varaktighet som helst i dess komponenter och dess totalsumma i sekunder, och bygger upp strängen igen från de tal du skriver in. När det du har är två klocktider i stället för en varaktighetssträng (ett skift som går från 22:00 till 06:30, till exempel), ger tidsdurationskalkylatorn den förflutna tiden, inklusive spann som sträcker sig över midnatt. Båda körs helt i din webbläsare: inget du skriver in lämnar din enhet. Och för snabb läsning utan något verktyg täcker två tumregler de flesta fall: leta efter T:et för att veta om ett M betyder månader eller minuter, och kom ihåg att allt till vänster om T:et är kalenderaritmetik, inte ett fast antal sekunder.

Verktyg i den här artikeln

Vanliga frågor

Är PT1M samma sak som P1M?

Nej. Bokstaven M byter betydelse beroende på T-avgränsaren: P1M är en månad, PT1M är en minut. Det är den vanligaste felläsningen av formatet, och vissa API-buggar har uppstått just av den anledningen. Är du osäker, leta först efter T:et: allt före det räknas i år, månader, veckor och dagar; allt efter det räknas i timmar, minuter och sekunder. En korrekt formad varaktighet har aldrig tidsenheter före T:et eller datumenheter efter det.

Hur skriver man 90 minuter som en ISO 8601-varaktighet?

PT90M och PT1H30M är båda giltiga och beskriver samma tidsmängd. ISO 8601 tvingar inte komponenterna att hålla sig inom sina konventionella intervall, så minuter över 59 eller timmar över 23 är helt i sin ordning. Tolkar accepterar båda skrivsätten; vilket ett system genererar beror på om det normaliserar. Genererar du varaktigheter för att läsas av människor är PT1H30M vänligare; jämför du varaktigheter i kod, jämför då deras totala sekunder i stället för strängarna, just eftersom två olika strängar kan betyda samma sak.

Vad är skillnaden mellan en varaktighet och ett intervall?

En varaktighet anger hur länge, utan position i kalendern: P3D är tre dagar, med start var som helst. Ett ISO 8601-intervall fäster en varaktighet vid faktiska datum, skrivet med ett snedstreck: 2026-07-04T00:00:00Z/P3D betyder de tre dagarna som börjar den 4 juli 2026, och ett start/slut-par som 2026-07-04/2026-07-07 uttrycker samma spann. Det finns även upprepade intervall med ett R-prefix: R5/2026-07-04T00:00:00Z/P1D betyder fem dagliga upprepningar från den starten. Intervall löser upp tvetydigheten hos kalenderenheter, eftersom P1M förankrat till ett datum alltid har en bestämd längd.

Källor