ISO 8601 날짜 및 시간 형식 설명
ISO 8601은 날짜와 시간을 문자열로 표현하는 국제 표준입니다. 표준형 2024-03-15T14:30:00Z는 모호하지 않고 정렬 가능하며 모든 현대 언어와 데이터베이스에서 지원됩니다. 이 가이드는 형식을 구성 요소별로, 대부분의 API가 실제로 쓰는 RFC 3339 부분집합, 더 새로운 RFC 9557 시간대 확장, 그리고 기간·간격·주 날짜의 변형을 다룹니다.
ISO 8601이란?
ISO 8601은 국제표준화기구의 날짜·시간 표현입니다. 현재 버전(ISO 8601-1:2019 / -2:2019)은 간결하고 순서가 정해진, 언어 중립적인 텍스트 형식을 정의합니다. 그 목적은 전적으로 모호함의 제거입니다. 03/04/2024 같은 날짜는 미국에서는 3월 4일, 유럽 대부분에서는 4월 3일이지만, 2024-03-04는 어디서나 같은 뜻입니다. 이 표준은 또한 대부분의 인터넷 프로토콜이 실제로 쓰는 프로파일인 RFC 3339의 기반입니다.
- 항상 연-월-일 순서: 2024-03-15 (03/15/2024나 15/03/2024가 아님)
- 시간 부분은 문자 T나 공백으로 구분: 2024-03-15T14:30:00
- 시간대는 명시: UTC는 Z, 오프셋은 ±HH:MM
- 텍스트로 정렬 가능 — 사전식 순서가 연대순과 일치
표준 날짜·시간 형식
가장 흔한 형태는 2024-03-15T14:30:00.123Z 같습니다. 모든 구성 요소는 고정 너비에 0으로 채워지며, 바로 그것이 형식을 정렬 가능하고 모호하지 않게 만듭니다.
| 구성 요소 | 예 | 의미 |
|---|---|---|
| YYYY | 2024 | 네 자리 연도 |
| MM | 03 | 두 자리 월(01–12) |
| DD | 15 | 두 자리 일(01–31) |
| T | T | 날짜/시간 구분자(RFC 3339는 공백도 허용) |
| hh:mm:ss | 14:30:00 | 24시간제, 0으로 채움 |
| .fff | .123 | 선택적 소수 초(ISO 8601에서는 임의 정밀도) |
| Z 또는 ±hh:mm | Z | 시간대 지정자(Z = UTC = +00:00) |
시간대 지정자
ISO 8601 시간대는 UTC로부터의 오프셋으로 인코딩되며, EST나 CET 같은 시간대 약어(모호함)로는 결코 표현하지 않습니다. 문자열은 일부 지역이 쓰는 30분 및 45분 오프셋을 포함해 정확한 UTC 순간을 재구성하기에 충분한 정보를 담습니다.
| 지정자 | UTC로부터의 오프셋 | 예시 시간대 |
|---|---|---|
| Z | +00:00 | UTC("Zulu" 시간) |
| +09:00 | 9시간 빠름 | 일본 표준시 |
| -05:00 | 5시간 느림 | 미국 동부 표준시 |
| +05:30 | 5.5시간 빠름 | 인도 표준시 |
| +05:45 | 5.75시간 빠름 | 네팔 표준시 |
| (없음) | 미지정 | 로컬 시간 — 모호함; API에서 피할 것 |
ISO 8601 vs RFC 3339
RFC 3339는 ISO 8601의 프로파일로, 더 제한적이고 파싱하기 쉽습니다. 대부분의 인터넷 프로토콜(JSON API, HTTP, IETF 사양)은 구체적으로 RFC 3339를 겨냥하므로, API가 "ISO 8601"이라고 할 때 거의 항상 RFC 3339 부분집합을 의미합니다. 차이는 작지만 주어진 문자열이 파싱되는지를 결정합니다.
| 항목 | ISO 8601 | RFC 3339 |
|---|---|---|
| 날짜/시간 구분자 | T, 또는 기본 형식에서 생략 | T 또는 단일 공백(필수) |
| 시간대 오프셋 | 선택 | 필수 |
| 소수 초 | 임의 정밀도 | 허용, 파서에서 상한 |
| 기본 형식(하이픈 없음) | 20240315T143000Z 허용 | 불허 |
| 주/서수 날짜 | 허용 | 불허 |
| 전형적 용도 | 아카이브, 스프레드시트, 교환 | JSON API, HTTP, IETF 사양 |
RFC 9557: 시간대와 Temporal 확장
+01:00 같은 순수 오프셋은 순간은 알려 주지만 시간대는 알려 주지 않습니다 — 게다가 오프셋은 일광 절약 시간에 따라 바뀌므로 같은 시간대도 겨울에는 +01:00, 여름에는 +02:00입니다. RFC 9557(2024)은 Internet Extended Date/Time Format(IXDTF)으로 그 틈을 메웁니다. 2024-03-15T14:30:00+01:00[Europe/Paris]처럼 대괄호로 IANA 시간대 이름을 덧붙입니다. 이는 JavaScript Temporal API가 읽고 쓰는 문자열 형식이므로 Temporal 채택이 늘면서 더 자주 보게 됩니다. 하위 호환을 유지합니다 — 대괄호 접미사를 떼면 평범한 RFC 3339 타임스탬프가 됩니다.
- 오프셋만: 2024-03-15T14:30:00+01:00 — 순간은 알지만 시간대는 모름
- IXDTF(RFC 9557): 2024-03-15T14:30:00+01:00[Europe/Paris] — 순간과 시간대
- 하위 호환: 대괄호 태그는 RFC 3339 파서가 무시 가능
변형: 기간, 간격, 주 날짜
ISO 8601은 순간 이상을 다룹니다. 여러 변형이 스케줄링, 아카이브, 리포팅 시스템에서 정기적으로 등장합니다.
- 기간: P3Y6M4DT12H30M5S = 3년 6개월 4일 12시간 30분 5초
- 간격: 2024-01-01/2024-02-01, 또는 2024-01-01/P1M(시작 + 기간)
- 서수 날짜: 2024-075 = 2024년의 75번째 날(3월 15일)
- 주 날짜: 2024-W11-5 = 2024년 ISO 11주차 금요일
- 반복 간격: R3/2024-01-01/P1D = 1월 1일부터 하루짜리 간격 3회
코드 속 ISO 8601
모든 주류 언어는 RFC 3339 부분집합을 기본으로 생성하고 파싱할 수 있습니다. 가장 안전한 습관은 Z가 붙은 UTC로 내보내고 순간으로 다시 파싱하며, 시간대 변환은 표시 계층에 맡기는 것입니다.
- JavaScript 출력: new Date().toISOString() // '2024-03-15T14:30:00.123Z'
- JavaScript 파싱: new Date('2024-03-15T14:30:00Z') // RFC 3339 부분집합
- Python 출력: datetime.now(timezone.utc).isoformat()
- Python 파싱: datetime.fromisoformat('2024-03-15T14:30:00+00:00') // 3.11+에서 완전한 ISO
- 대부분의 데이터베이스(Postgres, SQLite)는 ISO 8601 timestamptz를 직접 받고 반환
흔한 ISO 8601 실수
엄격한 표준이 있어도 파싱과 출력 코드는 똑같은 몇 가지 실수를 합니다.
- 시간대 생략: Z도 오프셋도 없는 2024-03-15T14:30:00은 모호함
- "+00:00" 대신 "+0000" 사용 — 받아 주는 파서도 있지만 RFC 3339는 불가
- 문자가 아닌 T 사용(유니코드 비슷한 글자는 복사·붙여넣기에 약함)
- 12시간제 AM/PM을 ISO 8601에 섞음 — 항상 24시간제
- 소수 초를 반올림 없이 자름 — 정밀도를 하나 정해 고수
- ISO 8601을 로케일 의존으로 취급 — 그렇지 않음; 형식은 언어와 무관하게 고정
관련 참고
FAQ
- "2024-03-15 14:30:00Z"는 유효한 ISO 8601인가요?
- 예 — 날짜와 시간 사이의 공백은 ISO 8601(그리고 RFC 3339)에서 허용됩니다. 모호하지 않은 기계 파싱에는 T 형식이 선호됩니다.
- 끝의 Z는 무슨 뜻인가요?
- Z는 UTC(오프셋 +00:00)를 뜻합니다. 문자 Z를 가리키는 NATO/항공 음성 기호인 "Zulu time"의 약자입니다.
- JavaScript에서 ISO 8601을 어떻게 파싱하나요?
- new Date("2024-03-15T14:30:00Z")는 표준 RFC 3339 부분집합에서 동작합니다. 더 폭넓은 ISO 8601 지원에는 date-fns 같은 라이브러리나 Temporal API를 사용하세요.
- ISO 8601은 RFC 3339와 같은가요?
- 아니요 — RFC 3339는 엄격한 부분집합입니다. 모든 RFC 3339 타임스탬프는 유효한 ISO 8601이지만, 모든 ISO 8601 타임스탬프가 유효한 RFC 3339는 아닙니다.
- RFC 9557이란 무엇인가요?
- RFC 9557(2024)은 RFC 3339를 Internet Extended Date/Time Format(IXDTF)으로 확장합니다. 대괄호로 IANA 시간대 이름을 덧붙이며(예: 2024-03-15T14:30:00+01:00[Europe/Paris]), JavaScript Temporal API가 쓰는 문자열 형식의 토대가 됩니다.
- T 구분자는 필수인가요?
- 엄격한 ISO 8601에서는 기본 형식에서 T를 생략할 수 있지만, RFC 3339는 T 또는 단일 공백을 요구합니다. 기계 파싱에는 항상 T를 포함하세요.
- ISO 8601과 ISO 8601-2의 차이는 무엇인가요?
- ISO 8601-1은 기본 날짜·시간 표현을 다룹니다. ISO 8601-2(2019년 확장)는 불확실한 날짜, 한정 값, 복잡한 간격 같은 새로운 구성을 추가합니다.