개발 이야기3분 읽기

90분을 적는 네 가지 방법

PT1H30M, 01:30:00, 90m, 5400. 기간 표기가 왜 여러 개이고 어디서 서로 어긋나는지 정리했습니다.

같은 90분이 코드 안에서 네 가지 모양으로 돌아다닙니다.

PT1H30M    ISO 8601
01:30:00   시계 표기
90m        사람이 쓰는 축약
5400       초

변환은 곱셈과 나눗셈뿐인 것 같지만, 몇 자리에서 그렇지 않습니다.

ISO 8601에서 M은 두 가지다

P1M   →  1개월
PT1M  →  1분

P는 기간의 시작을 알리고, T는 시각 부분의 시작을 알립니다. MT 앞에 있으면 달(month), 뒤에 있으면 분(minute)입니다. T를 빼먹으면 조용히 다른 값이 됩니다.

전체 구조는 P[n]Y[n]M[n]W[n]D T [n]H[n]M[n]S입니다. 90분을 적는 방법이 이 안에서도 여럿입니다.

PT1H30M   →  5400초
PT90M     →  5400초
PT5400S   →  5400초

셋 다 유효하고 값이 같습니다. 정규화된 형태를 요구하는 시스템이라면 PT1H30M을 기대할 텐데, 규격 자체는 나머지도 허용합니다.

거절해야 하는 것들도 있습니다.

P        거절   지정자가 하나도 없다
PT       거절   T 뒤가 비었다
1H30M    거절   P 가 없다
P1H      거절   H 는 T 뒤에만 온다
PT1D     거절   D 는 T 앞에만 온다
P-1D     거절   음수는 이 위치에 못 온다
P1.5Y    통과   마지막 성분의 소수는 허용된다

P1.5Y가 통과하는 것이 규격입니다. 다만 1.5년이 며칠인지는 정해져 있지 않습니다.

달과 초는 서로 환산되지 않는다

2026-01-01 + P1M = 2026-02-01  →  31일
2026-02-01 + P1M = 2026-03-01  →  28일
2024-02-01 + P1M = 2024-03-01  →  29일

P1M은 28일에서 31일 사이입니다. 어느 날짜에 더하느냐로 정해집니다. 그래서 P1M을 초로 바꿔 저장할 수 없습니다 — 기준 날짜 없이는 값이 없습니다.

ISO 8601이 기간을 두 덩어리로 나눈 이유입니다. 년·월은 달력 단위라 기준이 필요하고, 일·시·분·초는 고정 길이입니다.

정확히는 일도 완전히 고정은 아닙니다.

2026-03-08 New York  23시간
2026-11-01 New York  25시간

서머타임 전환일입니다. P1D를 24시간으로 환산하면 이 이틀에서 어긋납니다.

시계 표기는 24시를 넘어간다

    90초  →   0:01:30
  5400초  →   1:30:00
  3661초  →   1:01:01
 86399초  →  23:59:59
 90061초  →  25:01:01

25:01:01은 시각이 아니라 기간이라 유효합니다. 시각이라면 없는 값이지만 "25시간 1분 1초"는 말이 됩니다. 기간을 시각 파서로 읽으면 여기서 실패합니다.

자릿수도 정해진 규칙이 없습니다. 1:30:00인지 01:30:00인지, 한 시간 미만일 때 1:30으로 줄이는지 0:01:30으로 유지하는지가 구현마다 다릅니다. 이 표기로 주고받으려면 양쪽이 같은 규칙을 써야 합니다.

사람이 쓴 축약

90m, 1h30m, 1.5시간, 1시간 30분 같은 입력은 규격이 없습니다. 파서를 직접 만들 때 정해야 할 것들이 있습니다.

  • 단위 없는 숫자는 무엇인가 — 90이 90초인지 90분인지
  • m이 분인지 달인지 — ISO와 반대로 대부분의 축약에서 m은 분입니다
  • 공백과 순서를 허용하는가 — 1h 30m, 30m 1h
  • 합산인가 대체인가 — 1h 90m이 2시간 30분인지 오류인지

기본값을 문서에 적어 두지 않으면 사용자와 구현이 다른 가정을 합니다.

확인 순서

  1. ISO 8601 기간을 만든다면 T가 빠지지 않았는지 봅니다. P1MPT1M은 4만 배 남짓 차이입니다 — 한 달을 30일로 보면 43,200배입니다
  2. 달 단위 기간을 초로 저장하고 있다면 기준 날짜를 함께 저장하거나 달 단위로 저장합니다
  3. 하루를 86,400초로 더하는 코드가 서머타임 지역에서 도는지 확인합니다
  4. 시계 표기를 파싱한다면 24시 이상을 받는지 봅니다
  5. 사용자 입력 축약은 단위 없는 숫자의 기본 단위를 정하고 화면에 표시합니다

tools.onuel.dev기간 변환기는 초·분·시·시계 표기·ISO 8601 사이를 오갑니다. 90m, 01:30:00, PT1H30M을 각각 넣어 보면 같은 값으로 읽히는 것을 확인할 수 있습니다. 날짜가 달린 계산은 나이·날짜 차이 계산기에서, 타임스탬프 변환은 Epoch 변환에서 하고, 지역이 걸리면 시간대 변환기를 함께 씁니다. 길이·무게 같은 단위는 단위 변환기입니다.

  • #기간
  • #ISO 8601
  • #파싱