엑셀 JSON 변환 날짜가 숫자로 나오는 이유 — 일련번호 계산법

엑셀 파일을 JSON으로 바꿨는데 '가입일' 칸에 2026-01-15 대신 46037 같은 숫자가 찍혀 있다면, 파일이 깨진 게 아닙니다. 엑셀은 애초에 날짜를 화면에 보이는 문자열이 아니라 일련번호로 저장하고, JSON 변환은 그 저장값을 그대로 꺼내 오기 때문입니다.
이 숫자가 어디서 왔는지, 실제 날짜로 되돌리는 공식은 무엇인지, 그리고 애초에 숫자가 나오지 않게 막는 방법까지 순서대로 정리합니다.
요약 ① 엑셀 셀에는 '날짜'라는 자료형이 따로 없습니다. 실제 저장값은 정수(일련번호)이고, 화면에 보이는 날짜는 서식일 뿐입니다. ② 일련번호는 1900년 1월 1일을 1로 잡고 하루씩 센 값이라, 공식 하나로 실제 날짜를 계산할 수 있습니다. ③ 엑셀에서 TEXT 함수로 날짜를 문자열로 바꾼 뒤 값 붙여넣기를 해 두면, 변환할 때부터 숫자 대신 문자열이 나옵니다.
문제: JSON엔 날짜 대신 다섯 자리 숫자가 있습니다
가입일·주문일처럼 날짜가 들어간 열을 가진 엑셀 표를 JSON으로 바꿔 보면, 이름이나 금액 열은 멀쩡한데 날짜 열만 44562, 45678 같은 정수로 나옵니다. 에러 메시지는 없고 JSON 형식도 정상이라 더 당황스럽습니다.
엑셀 화면에서는 분명히 2022-01-01처럼 날짜로 보였던 칸입니다. 그런데 그 표시는 셀에 적용된 서식일 뿐, 셀 안에 실제로 저장된 값은 처음부터 정수였습니다.
JSON으로 변환하는 과정은 화면에 그려지는 모양이 아니라 셀의 저장값을 그대로 읽어 옵니다. 그래서 서식이 벗겨지고 원래 값인 정수가 그대로 드러나는 것입니다.
해결: 일련번호를 실제 날짜로 계산하는 공식
엑셀(윈도우 기본값 기준)은 1900년 1월 1일을 일련번호 1로 잡고, 그 뒤로 하루가 지날 때마다 1씩 더한 값을 날짜 셀에 저장합니다. 시간까지 있는 셀은 하루를 1로 보고 그 안의 비율을 소수부에 더합니다.
이 값을 실제 날짜로 되돌리는 공식은 다음과 같습니다.
유닉스 밀리초 = (엑셀 일련번호 − 25569) × 86400 × 1000
25569는 엑셀의 날짜 기준일(1899년 12월 30일)과 1970년 1월 1일(유닉스 기준일) 사이의 날짜 수입니다. 이 값을 빼고 하루 단위(86400초)를 밀리초로 바꾸면, 자바스크립트의 new Date(...)에 바로 넣을 수 있는 값이 됩니다.
숫자로만 보면 감이 안 오니 실제로 계산해 보겠습니다.
| JSON에 나온 일련번호 | 계산 결과(실제 날짜) |
|---|---|
| 44562 | 2022-01-01 |
| 45678 | 2025-01-21 |
| 46037 | 2026-01-15 |
소수점이 붙어 있다면(예: 46037.5) 그 셀에 시간도 함께 저장돼 있다는 뜻입니다. 소수부 0.5에 24시간을 곱하면 12시, 즉 그날 정오를 가리킵니다.
이 계산은 JSON을 받은 뒤 코드나 스프레드시트에서 되짚는 방법이지만, 애초에 숫자가 나오지 않게 막을 수도 있습니다. 엑셀에서 원본 날짜 열 옆에 =TEXT(A2,"yyyy-mm-dd") 수식을 넣은 새 열을 만들고, 그 열을 복사해 같은 자리에 값으로 붙여넣기를 하면 셀 안의 실제 값이 "2022-01-01" 같은 문자열로 바뀝니다. 수식만 걸어 두고 값 붙여넣기를 하지 않으면 원본 날짜 셀이 그대로 남아 있어 여전히 숫자로 나오니, 이 마지막 단계를 빠뜨리지 않아야 합니다.
문자열로 바뀐 열은 서식이 아니라 값 자체가 텍스트이므로, 어떤 방식으로 JSON을 만들어도 숫자가 아니라 "2022-01-01"이 그대로 나옵니다. 저희 도구로 실제 변환 결과를 확인해 보겠습니다.
설치·회원가입 없이 브라우저 안에서 엑셀을 JSON으로 바꾸며, 업로드한 파일은 서버로 전송되지 않습니다.

자주 막히는 지점
| 증상 | 원인 |
|---|---|
| 날짜 열이 4~5자리 정수로 나옴 | 정상입니다. 엑셀 날짜 일련번호이며 위 공식으로 실제 날짜를 계산할 수 있습니다 |
| 정수에 소수점이 붙어 있음(예: 46037.5) | 날짜와 시간이 함께 저장된 셀입니다. 소수부가 그날의 시각을 나타냅니다 |
| TEXT 함수로 바꿨는데도 여전히 숫자로 나옴 | 수식만 걸어 둔 상태입니다. 값으로 붙여넣기까지 해야 셀 값이 진짜 문자열로 고정됩니다 |
| '첫 행을 헤더로 사용' 체크를 껐더니 결과가 배열로 바뀜 | 헤더 없이 변환하면 각 행이 배열이 되고, 제목 행도 데이터의 일부로 포함됩니다 |
| 빈 날짜 칸이 있는 행인데 JSON엔 빈 문자열로 나옴 | 이 도구는 빈 셀을 생략하지 않고 빈 문자열로 채웁니다. 모든 행이 같은 키를 갖게 하기 위해서입니다 |
정리
- 엑셀 셀에는 '날짜' 자료형이 따로 없습니다. 실제 저장값은 정수(일련번호)이고, 화면의 날짜 모양은 서식일 뿐입니다.
- 일련번호는 1900년 1월 1일을 1로 잡고 하루씩 센 값입니다.
(일련번호 − 25569) × 86400 × 1000으로 유닉스 밀리초를 구할 수 있습니다. - 예를 들어 44562는 2022-01-01, 45678은 2025-01-21, 46037은 2026-01-15입니다.
- 소수점이 붙은 값은 시간까지 저장된 셀이며, 소수부 × 24시간이 그날의 시각입니다.
- 애초에 숫자가 나오지 않게 하려면 엑셀에서
=TEXT(원본,"yyyy-mm-dd")로 변환한 뒤 값 붙여넣기를 해 문자열로 고정하면 됩니다.
설치·회원가입 없이 브라우저 안에서 엑셀을 JSON으로 바꾸며, 업로드한 파일은 서버로 전송되지 않습니다.
자주 묻는 질문
1900년 이전 날짜나 오래된 매킨토시 파일도 이 공식이 맞나요?
윈도우 엑셀은 1900년 1월 1일을 기준일로 삼는 "1900 날짜 시스템"을 기본으로 씁니다. 반면 예전 매킨토시용 엑셀은 1904년 1월 1일을 기준일로 삼는 "1904 날짜 시스템"을 기본값으로 쓴 적이 있는데, 두 기준일의 일련번호는 정확히 1462일 차이가 납니다.
아주 오래된 매킨토시 엑셀 파일을 열었는데 계산 결과가 몇 년씩 어긋나 보인다면, 파일이 어느 날짜 시스템으로 저장됐는지부터 확인해야 합니다. 대부분의 최신 엑셀 파일은 1900 날짜 시스템을 씁니다.
엑셀에 업로드한 파일이 서버로 전송되나요?
아니요. 파일을 읽고 시트를 파싱해 JSON으로 만드는 과정 전부가 브라우저 안에서 처리되며, 파일은 서버로 올라가지 않습니다. 가입일·매출 같은 내부 데이터가 담긴 표라도 외부로 나가지 않습니다.
'첫 행을 헤더(키)로 사용' 체크박스는 언제 꺼야 하나요?
원본 표에 제목 행이 없거나, 제목 행 자체도 데이터의 일부로 다뤄야 할 때 끕니다. 체크를 끄면 각 행이 {"가입일": 46037} 같은 객체가 아니라 [46037, "김민준", 15000] 같은 배열로 나오고, 원래 제목 행도 배열 하나로 포함됩니다.
