초 vs 밀리초
1777118400
1777118400000
앞 값을 초로, 뒤 값을 밀리초로 해석하면 둘은 정확히 같은 순간을 가리킵니다. 이 둘을 헷갈려서 생기는 버그가 타임스탬프 관련 버그 중 단연 1위입니다.
Unix 타임스탬프, ISO 8601, UTC, 로컬 시간을 상호 변환.
마지막 업데이트
177723998217772399820002026-04-26T21:46:22.000Z2026-04-26 21:46:22Sun, 26 Apr 2026 21:46:22 GMTUnix 타임스탬프 변환기는 *epoch 시간* — 어떤 한 순간을 나타내는 단일 숫자 — 을 사람이 읽을 수 있는 날짜로 바꿔주고, 반대로 날짜를 다시 타임스탬프로 변환해 줍니다. 개발하다 보면 타임스탬프는 어디에나 있습니다. DB 컬럼, 로그 한 줄, API 응답, 분석 이벤트, JWT의 exp 클레임, 스케줄러 트리거, 캐시 만료 헤더까지요.
원리는 단순합니다. 컴퓨터는 시간을 숫자(1970-01-01 00:00:00 UTC 이후 경과한 초 또는 밀리초)로 저장하지만, 사람은 달력과 타임존, 그리고 읽기 좋은 형식이 필요합니다. 이 둘을 오가는 변환은 웹·모바일 앱 디버깅에서 가장 자주 마주치는 작업 중 하나입니다.
가장 헷갈리는 건 *단위*입니다. POSIX와 대부분의 백엔드 언어는 초를 씁니다. 반면 JavaScript, Java, 그리고 많은 메시지 브로커는 밀리초를 씁니다. 어떤 메트릭 시스템은 마이크로초나 나노초까지 갑니다. 자릿수가 10자리면 거의 확실히 초, 13자리면 거의 확실히 밀리초라고 보면 됩니다.
1970-01-01 00:00:00 UTC) 이후의 *초* 또는 *밀리초* 단위로 시간을 표현합니다.2026-04-25T12:00:00Z)은 어디서든 통하는 텍스트 형식입니다. 끝의 Z(또는 +00:00)는 UTC를 의미하고, +02:00 같은 오프셋은 UTC보다 2시간 빠른 로컬 시간이라는 뜻입니다.숫자(초 또는 밀리초)나 날짜 문자열을 그대로 붙여넣으세요. 변환기가 자릿수와 형태를 보고 형식을 자동으로 감지합니다.
자동 감지가 빗나갔다면 초/밀리초 토글로 바꿔주세요. 10자리면 초, 13자리면 밀리초입니다.
출력에는 UTC 기준 ISO 8601, 사용자의 로컬 시간, 그리고 사람이 읽기 좋은 상대 시간(3시간 전, 2일 후)이 함께 표시됩니다.
타임스탬프, ISO 문자열, 로컬 시간 중 원하는 것만 바로 복사할 수 있습니다. JWT exp 채울 때, DB 행에 넣을 때, 로그 쿼리 작성할 때 유용합니다.
코드에서 날짜·시간을 다룰 때 가장 자주 마주치는 형식들입니다. ISO 8601은 IETF의 RFC 3339로도 표준화되어 프로토콜에서 널리 쓰입니다.
| 형식 | 예시 | 주로 쓰이는 곳 |
|---|---|---|
| Unix 초 | 1777118400 | 백엔드 로그, JWT exp, POSIX time(), Redis |
| Unix 밀리초 | 1777118400000 | JavaScript Date.now(), Java System.currentTimeMillis() |
| ISO 8601 UTC | 2026-04-25T12:00:00Z | REST API, JSON, GraphQL, 로그 파일 |
| 오프셋 포함 ISO 8601 | 2026-04-25T14:00:00+02:00 | 사용자에게 보여주는 일정, 캘린더 초대 |
| RFC 2822 | Sat, 25 Apr 2026 12:00:00 GMT | 이메일 헤더, HTTP Date·Last-Modified |
| 날짜만 | 2026-04-25 | 생일, 공휴일 — 타임존 의미 없음 |
1777118400
1777118400000
앞 값을 초로, 뒤 값을 밀리초로 해석하면 둘은 정확히 같은 순간을 가리킵니다. 이 둘을 헷갈려서 생기는 버그가 타임스탬프 관련 버그 중 단연 1위입니다.
{ "id": 42, "createdAt": 1777118400, "expiresAt": 1777204800}이 값이 과거인지 미래인지 추측하기 전에 일단 변환부터 해보세요. 대부분의 JSON API는 Unix 초를 쓰지만, 항상 문서를 확인하는 게 안전합니다. JavaScript 기반 백엔드는 종종 밀리초로 내려보냅니다.
2026-04-25T12:00:00Z
2026-04-25T14:00:00+02:00
두 문자열은 *같은 순간*을 표현합니다. 데이터는 항상 UTC로 저장하고, 화면에 보여줄 때만 로컬 시간으로 변환하는 습관을 들이세요.
1700000000을 초로 읽으면 2023년 11월이지만, 밀리초로 읽으면 1970년 1월이 됩니다.'2026-04-25')로 비교하기. 같은 순간을 표현하는 ISO 문자열도 형식이 다르면 다르게 보입니다.1970-01-01 00:00:00 UTC 이후 경과한 시간을 초(또는 밀리초) 단위 숫자로 나타낸 값입니다. 타임존과 무관하게 특정 순간을 단 하나의 숫자로 표현할 수 있습니다.Date.now()는 밀리초를 반환하고, 대부분의 백엔드는 초를 반환합니다.Date 객체는 Unix epoch 이후의 밀리초 값으로 시간을 저장합니다 — Date.now()와 new Date().getTime()이 그 값을 그대로 돌려주죠. 초보다 정밀하지만, 다른 언어와 주고받을 때 1000배 차이로 인한 버그를 자주 일으킵니다.new Date(...)에 넘기면 되고, Python에서는 datetime.fromtimestamp(...)를 쓰면 됩니다. 아니면 그냥 Unix 타임스탬프 변환기에 붙여넣어 클릭 한 번으로 끝낼 수도 있고요.2038-01-19에 오버플로됩니다 — 이른바 2038년 문제죠. 다만 요즘 언어와 DB는 64비트 정수로 저장하기 때문에, 안전한 표현 범위가 수천억 년 단위로 늘어납니다.