시간 길이 변환기 (초 · 밀리초 · 시:분:초)
초·밀리초를 시:분:초로, 시:분:초를 초로 양방향
음이 아닌 10진수
1시간 30분
시계 (HH:MM:SS)
01:30:00
ISO 8601
PT1H30M
| 밀리초 | 5400000ms | |
| 초 | 5400s | |
| 분 | 90min | |
| 시간 | 1.5h | |
| 일 | 0.0625d | |
| 주 | 0.008929주 |
시계·복합 표기로 입력
1:30:00, 1h30m, 90m, 500ms 를 넣으면 위 결과가 채워집니다.
HH:MM:SS · MM:SS · 1h30m · 45sec
이건 ‘시각’이 아니라 ‘길이’다
먼저 구분 하나. 이 도구가 다루는 것은 “몇 시 몇 분”(시각)이 아니라 “얼마나 걸리는가”(길이)입니다. “오후 3시”는 시각이고, “3시간 30분”은 길이입니다. 길이에는 날짜도 타임존도 없습니다 — 90분은 서울에서든 뉴욕에서든 5,400,000밀리초입니다. 특정 시각(달력·타임존)이 필요하면 타임스탬프 변환기가 그쪽을 다룹니다. 이 둘을 섞는 데서 시간 버그의 절반이 나옵니다.
가장 흔한 버그: 초 ↔ 밀리초 1000배
같은 시간을 두 세계가 다른 단위로 셉니다. 그리고 그 경계에서 1000배가 어긋납니다.
- 밀리초를 쓰는 쪽 — 자바스크립트(
Date.now(),setTimeout,performance.now()), 자바의System.currentTimeMillis(). - 초를 쓰는 쪽 — Unix 타임스탬프, 대부분의 서버·DB·유닉스 도구, JWT 의
exp·iat.
그래서 초 단위 타임스탬프를 자바스크립트 new Date()에 그대로 넣으면 1970년 근처가 나오고(1000배 작게 해석), 반대로 밀리초를 초로 보내면 수만 년 뒤가 됩니다. 값의 자릿수로 빠르게 구분할 수 있습니다 — 현재 시각 기준 13자리면 밀리초, 10자리면 초입니다. setTimeout(fn, 3)이 3초가 아니라 3밀리초라 안 기다리는 것도 같은 뿌리입니다.
60진법과 시계 표기
분과 초는 10진법이 아니라 60진법입니다. 60초 = 1분, 60분 = 1시간. 그래서 90분이 1.5시간인 건 익숙해도, 150분을 2시간 30분으로, 3661초를 1시간 1분 1초로 바로 읽기는 어렵습니다 — 머릿속에서 60으로 두 번 나눠야 하기 때문입니다. 위 변환기가 HH:MM:SS시계 형식과 “1시간 1분 1초” 분해를 동시에 내주는 이유입니다. 참고로 시(時)는 24에서 되감지 않고 그대로 누적합니다 — 90,000초는 25:00:00입니다.
ISO 8601: 길이를 문자열로 적는 표준
시간 길이를 API 로 주고받을 때의 국제 표준이 ISO 8601 duration입니다. P(period)로 시작해 날짜부와 T 뒤의 시간부로 나뉩니다.
PT1H30M 1시간 30분
PT45S 45초
P1DT2H 1일 2시간
PT0S 0 (길이 없음)YouTube Data API 의 영상 길이, JSON Schema, GitHub Actions·Kubernetes 의 타임아웃이 이 형식을 씁니다. 사람이 손으로 쓰긴 번거로워도 기계가 파싱하기엔 명확합니다. 위 변환기가 입력한 길이를 ISO 8601 로 함께 찍어 주므로, 설정 파일이나 요청에 그대로 붙여넣을 수 있습니다.
왜 ‘월’과 ‘년’은 뺐나
이 변환기는 밀리초부터 주(week)까지만 다룹니다. 월·년을 뺀 것은 기능을 덜 만든 게 아니라, 정확하지 않은 값을 내지 않기 위해서입니다.한 달은 28~31일로 다르고 1년은 평년·윤년이 달라, “3개월이 며칠이냐”는 어느 달부터인지를 알아야만 답할 수 있습니다. 시작 날짜가 없으면 정답이 존재하지 않습니다.
많은 변환기가 여기서 “한 달 = 30일” 같은 어림값을 슬쩍 넣습니다. 그러면 화면은 채워지지만 답은 틀립니다 — 그것도 그럴듯하게 틀려서 더 위험합니다. 이 도구는 길이가 고정된 단위까지만 정확히 변환하고, 달력에 의존하는 월·년은 다루지 않습니다. 특정 날짜 사이의 기간이 필요하면 그건 duration 이 아니라 달력 계산의 몫입니다.
자주 묻는 질문
- 초와 밀리초를 왜 자꾸 헷갈리나요?
- 같은 '시간'을 두 세계가 다른 단위로 세기 때문입니다. 자바스크립트의 Date.now()·setTimeout()·performance는 전부 밀리초(ms)를 쓰는데, Unix 타임스탬프와 대부분의 서버·DB·유닉스 도구는 초(s)를 씁니다. 그래서 프런트엔드와 백엔드가 시간을 주고받을 때 1000배가 어긋나는 버그가 흔합니다 — 초를 그대로 new Date()에 넣으면 1970년 근처가 나오고, 밀리초를 초로 보내면 5만 년 뒤가 됩니다. 값이 13자리면 밀리초(2001년 이후), 10자리면 초라고 기억하면 구분에 도움이 됩니다.
- setTimeout의 숫자는 초인가요 밀리초인가요?
- 밀리초입니다. setTimeout(fn, 1000)은 1초 뒤에 실행합니다 — 1000이 아니라 1로 적으면 1밀리초, 즉 거의 즉시 실행됩니다. '3초 기다리게 했는데 안 기다린다'는 대개 3을 넣어서(=3ms) 생기는 문제입니다. 자바스크립트의 시간 관련 API는 사실상 전부 밀리초라고 보면 됩니다.
- ISO 8601 duration(PT1H30M)이 무엇인가요?
- 시간 '길이'를 문자열로 적는 국제 표준입니다. P로 시작하고, 날짜부(P1D)와 시간부(T 뒤의 1H30M)로 나뉩니다 — 예: PT1H30M은 1시간 30분, P1DT2H는 1일 2시간입니다. YouTube Data API의 영상 길이, JSON Schema, GitHub Actions·Kubernetes의 타임아웃 설정 등이 이 형식을 씁니다. 이 변환기는 입력한 길이를 ISO 8601로 함께 보여 주므로, 설정 파일이나 API 요청에 그대로 복사할 수 있습니다.
- 왜 '월'이나 '년' 단위는 없나요?
- 고정된 길이가 없기 때문입니다. 한 달은 28~31일로 달라지고, 1년은 평년(365일)과 윤년(366일)이 다릅니다. 그래서 '3개월이 며칠이냐'는 어느 달인지 알아야 답할 수 있고, 시작 날짜 없이는 정확한 변환이 불가능합니다. 이 변환기는 길이가 고정된 단위(밀리초~주)까지만 다룹니다 — 억지로 '한 달=30일'로 계산해 그럴듯한 오답을 내는 대신, 할 수 없는 것은 하지 않습니다. 특정 날짜 사이의 기간이 필요하면 달력 기반 날짜 계산이 따로 필요합니다.
- 90분은 몇 시간인가요?
- 1.5시간(1시간 30분)입니다. 분과 초는 60진법이라 100분이 1시간이 아니라 60분이 1시간인 점이 함정입니다. 그래서 150분을 무심코 2.5시간이 아니라 2시간 30분으로 바로 읽기 어렵습니다. 이 변환기는 입력을 '1시간 30분' 같은 사람이 읽는 분해와 01:30:00 시계 형식으로 동시에 보여 주므로, 60진법을 머릿속으로 나눌 필요가 없습니다.
- 하루는 항상 24시간(86,400초)인가요?
- '길이'로서는 그렇습니다. 이 변환기에서 1일은 정확히 24시간 = 86,400,000밀리초입니다. 다만 실제 달력에서는 서머타임(DST) 시작·종료일에 하루가 23시간이나 25시간이 되기도 하고, 아주 드물게 윤초가 끼기도 합니다. 그건 '시각(달력)'의 문제라 duration 변환과는 다른 층입니다 — 특정 시각을 다루려면 타임존이 필요한 타임스탬프 쪽 이야기가 됩니다.