타임스탬프 변환 가이드
Unix 타임스탬프(Unix timestamp)는 컴퓨터가 시간을 표현하는 가장 보편적인 방식입니다. 1970년 1월 1일 00:00:00 UTC를 기준(에포크)으로 경과한 초(seconds)의 수로 시간을 나타냅니다.
타임스탬프란?
| 항목 | 설명 |
|---|---|
| 정의 | 에포크(1970-01-01 00:00:00 UTC)부터 경과한 초 |
| 형식 | 정수(10자리: 초, 13자리: 밀리초) |
| 범위 (32비트) | -2,147,483,648 ~ 2,147,483,647 (1901~2038년) |
| 범위 (64비트) | 사실상 무제한 (수십억 년) |
| 에포크 값 | 0 = 1970-01-01T00:00:00Z |
변환 공식
타임스탬프 → 날짜
날짜(UTC) = new Date(타임스탬프 × 1000)
날짜(KST) = UTC 시간 + 9시간
날짜 → 타임스탬프
타임스탬프 = (날짜 - 에포크) / 1000
KST 입력 시: UTC = KST - 9시간 후 변환
주요 타임스탬프 값
| 타임스탬프 | UTC 날짜 | KST 날짜 | 의미 |
|---|---|---|---|
| 0 | 1970-01-01 00:00:00 | 1970-01-01 09:00:00 | Unix 에포크 |
| 946684800 | 2000-01-01 00:00:00 | 2000-01-01 09:00:00 | Y2K (밀레니엄) |
| 1000000000 | 2001-09-09 01:46:40 | 2001-09-09 10:46:40 | 10억 초 |
| 1234567890 | 2009-02-13 23:31:30 | 2009-02-14 08:31:30 | 기억하기 쉬운 값 |
| 1700000000 | 2023-11-14 22:13:20 | 2023-11-15 07:13:20 | 17억 초 |
| 2000000000 | 2033-05-18 03:33:20 | 2033-05-18 12:33:20 | 20억 초 |
| 2147483647 | 2038-01-19 03:14:07 | 2038-01-19 12:14:07 | 32비트 최대값 (Y2K38) |
시간대(Timezone)와 타임스탬프
Unix 타임스탬프는 항상 UTC 기준입니다. 시간대는 표시(display)할 때만 적용합니다.
| 시간대 | UTC 오프셋 | 설명 |
|---|---|---|
| KST | +09:00 | 한국 표준시 |
| JST | +09:00 | 일본 표준시 |
| CST | +08:00 | 중국 표준시 |
| EST | -05:00 | 미국 동부 표준시 |
| PST | -08:00 | 미국 태평양 표준시 |
| CET | +01:00 | 중앙유럽 표준시 |
| GMT | +00:00 | 그리니치 평균시 |
프로그래밍 언어별 타임스탬프
| 언어 | 현재 타임스탬프(초) | 타임스탬프→날짜 |
|---|---|---|
| JavaScript | Math.floor(Date.now()/1000) | new Date(ts * 1000) |
| Python | int(time.time()) | datetime.fromtimestamp(ts) |
| Java | System.currentTimeMillis()/1000 | Instant.ofEpochSecond(ts) |
| PHP | time() | date('Y-m-d', $ts) |
| Go | time.Now().Unix() | time.Unix(ts, 0) |
| C# | DateTimeOffset.UtcNow.ToUnixTimeSeconds() | DateTimeOffset.FromUnixTimeSeconds(ts) |
| Ruby | Time.now.to_i | Time.at(ts) |
| Rust | SystemTime::now().duration_since(UNIX_EPOCH) | UNIX_EPOCH + Duration::from_secs(ts) |
초 vs 밀리초 구분법
| 구분 | 자릿수 | 예시 | 주로 사용되는 곳 |
|---|---|---|---|
| 초 (seconds) | 10자리 | 1700000000 | Unix/Linux, Python, PHP, Go |
| 밀리초 (milliseconds) | 13자리 | 1700000000000 | JavaScript, Java, 대부분의 API |
| 마이크로초 (microseconds) | 16자리 | 1700000000000000 | PostgreSQL, 고정밀 시스템 |
| 나노초 (nanoseconds) | 19자리 | 1700000000000000000 | Go time.UnixNano(), 고성능 시스템 |
Y2K38 문제
2038년 1월 19일 03:14:07 UTC에 32비트 부호 있는 정수의 최대값(2,147,483,647)에 도달합니다. 이 시점 이후 32비트 시스템은 오버플로우가 발생하여 날짜가 1901년 12월로 되돌아갑니다.
대응 현황 (2026년 기준):
- Linux 커널 5.6+: 32비트 시스템에서도 64비트 time_t 지원
- 대부분의 64비트 운영체제: 이미 해결
- 임베디드 시스템, 레거시 소프트웨어: 여전히 위험
실용 팁
- API 통신 시 항상 UTC 사용 — 시간대 혼동을 방지하려면 서버 간 통신에서 UTC 타임스탬프를 사용하고, 사용자에게 표시할 때만 로컬 시간대로 변환하세요.
- 밀리초/초 혼동 주의 — JavaScript의 Date.now()는 밀리초, Python의 time.time()은 초를 반환합니다. 단위를 잘 확인하세요.
- 데이터베이스 저장 시 — INTEGER(Unix timestamp)로 저장하면 시간대 독립적이고 정렬·비교가 빠릅니다. DATETIME 타입은 시간대 정보 손실 위험이 있습니다.
- 음수 타임스탬프 테스트 — 1970년 이전 날짜를 다루는 시스템이라면 음수 타임스탬프 처리를 반드시 테스트하세요.
- 서머타임(DST) 주의 — 한국은 서머타임이 없지만, 미국·유럽 시간대를 다룰 때는 서머타임 전환 시점에서 1시간 차이가 생깁니다.
참고
- Unix 타임스탬프는 윤초(leap second)를 포함하지 않습니다. POSIX 표준에 따라 하루는 정확히 86,400초로 계산됩니다.
- ISO 8601 형식(예: 2026-01-01T00:00:00Z)은 사람이 읽기 쉬운 표준 날짜 형식으로, 'Z'는 UTC를 의미합니다.
※ 이 변환기는 참고용이며, 정밀한 시간 동기화가 필요한 경우 NTP 서버를 사용하세요.