ISO 8601
내용에 앞서
포트폴리오를 리뉴얼하면서 날짜를 다루기 위한 라이브러리로 moment대신 day.js가 가볍다하여 사용해보게 됐다.
그러나, Safari에서만 날짜 포멧이 적용이 되지 않는 것이다..!!moment에서는 발생하지 않았기에 처음에는 버그라고 생각했지만 확인해보니 day.js의 철학과 ISO 8601을 따르는 규칙이었기에 이에 대해 정리해보고자 한다.
ISO 8601 이란 ?
개발을 하다 보면 날짜와 시간을 다룰 일이 생각보다 많다.
하지만 "2026년 1월 30일 오후 1시"라는 단순한 정보도 나라마다 표기법은 제각각이다.
예를 들어 미국은 01/30/2026, 영국은 30/01/2026와 같은 형식을 사용한다.
이런 파편화를 막기 위해 등장한 국제 표준 규격이 바로 ISO 8601이다.
ISO 8601은 날짜와 시간을 표현하는 국제적인 표준이다.
이 표준은 전 세계적으로 통용되며, 데이터 교환, 소프트웨어 개발, 국제적인 커뮤니케이션 등 다양한 분야에서 사용된다.
ISO 8601의 구조
가장 표준적인 형태는 2026-01-30T13:23:56Z와 같은 형식이다.
- 연-월-일 (YYYY-MM-DD)로 가장 큰 단위부터 작은 단위로 나열한다.
- T (Separator)는 날짜와 시간 사이의 구분자이다.
- 시:분:초 (HH:mm:ss) 24시간 형식을 사용한다.
- Z (Timezone) 타임존을 의미한다. Z는 Zero meridian의 약자로 UTC(협정 세계시)를 뜻한다.
Safari에서만 문제가 발생한 이유
Safari는 ISO 8601 규격을 매우 엄격하게 따른다.
반면 Chrome이나 Firefox는 비표준 날짜 문자열도 관대하게 파싱해주는 경우가 많다.
이러한 차이로 인해 동일한 코드가 Safari에서만 실패했던 것이다.
내 프로젝트는 JSON 파일로 저장하고 데이터를 받아와서 보여주는 구조였다.
데이터를 저장할 때 날짜를 2026.01.30같은 형식으로 저장했기에 ISO 8601 규칙에 어긋나서 문제가 발생했던 것이다.
ISO 8601에서 권장되는 날짜 문자열 예시
- 2026-01-30
- 2026-01-30T13:23:56
- 2026-01-30T13:23:56Z
- 2026-01-30T13:23:56+09:00
반면, 아래와 같은 형식은 ISO 8601이 아니며, Safari에서는 Date 파싱에 실패한다.
- 2026.01.30
- 2026-01-30 13:23:56
대부분의 블로그 또는 Issue, dayjs not work in safari를 확인해보면 다들 . 을 /, -로 바꾸니 해결됐다. 이렇게 사용하자 또는 라이브러리에서 지원해줘야 하는 것 아니냐는 내용이 많다.
나 또한 처음에는 라이브러리에서 지원이 되어야한다라고 생각했다.
하지만, day.js 라이브러리를 만든 사람들이 왜 ISO 8601를 사용했는지 알게되니 이해가 됐다.