데이터베이스에서 1711699200이라는 숫자를 보거나, API 응답에 "created_at": 1711699200이 포함되어 있는 것을 본 적 있나요? 이것이 바로 Unix timestamp(유닉스 타임스탬프)입니다. 거의 모든 프로그래밍 언어·운영체제·데이터베이스가 지원하는 가장 범용적인 시간 표현 방식입니다. 이 글에서는 Unix timestamp가 무엇인지, 왜 사용하는지, 개발 현장에서 어떻게 활용되는지를 처음부터 차근차근 설명합니다.
1. Unix Timestamp의 정의
Unix timestamp는 Unix Epoch(에포크)——1970년 1월 1일 00:00:00 UTC——부터 특정 시각까지 경과한 초(second) 수를 나타내는 정수입니다.
| 사람이 읽을 수 있는 시각 (UTC) | Unix Timestamp |
|---|---|
| 1970-01-01 00:00:00 | 0 |
| 2000-01-01 00:00:00 | 946684800 |
| 2024-03-29 00:00:00 | 1711670400 |
| 2038-01-19 03:14:07 | 2147483647(32비트 최댓값) |
중요한 점은 Unix timestamp가 UTC(협정 세계시)를 기준으로 하며, 시간대(timezone) 정보를 포함하지 않는다는 것입니다. 동일한 timestamp는 서울(UTC+9)·런던(UTC+0)·뉴욕(UTC-5) 어디서나 같은 절대 시각을 가리킵니다. 표시되는 현지 시각만 다를 뿐입니다.
2. 왜 1970년부터 시작하나요?
천문학적·역법적으로 특별한 의미는 없으며, 순전히 역사적 이유입니다. Unix 운영체제가 1969〜1970년경 개발될 때, 시간의 "원점"으로 1970년 1월 1일 00:00:00 UTC가 선택되었습니다. 이후 Unix 호환 시스템이 모두 이를 따르면서 사실상 표준(de facto standard)이 되었습니다.
다른 시간 원점도 있습니다. Windows NT Epoch는 1601년 1월 1일, NTP는 1900년 1월 1일, Apple Core Data는 2001년 1월 1일입니다. 상호 변환 시 주의 가 필요합니다.
3. Unix Timestamp의 핵심 장점
- 타임존 독립적:절대 초 수이므로 어떤 타임존에서도 같은 숫자가 같은 시각을 가리킵니다. 국제 서비스의 시각 전달에 최적입니다.
- 단순 정수 비교:이벤트 A가 B보다 이전인지 판단하려면 두 정수 크기만 비교하면 됩니다. 윤년·월별 일수 등 역법 규칙을 고려할 필요가 없습니다.
- 저장·전송 효율:64비트 정수 하나로 표현되므로, DB 컬럼·JSON 필드·HTTP 헤더에 부담 없이 저장할 수 있습니다.
- 시간 계산 단순:"이 글이 3일 전 게시된 것인가?"는 현재 timestamp에서 게시 timestamp를 빼고 86400으로 나누면 됩니다.
4. 밀리초 Timestamp
정밀도가 요구되는 현대 시스템에서는 밀리초(millisecond) timestamp——Unix Epoch 이후 밀리초 수(초 × 1000)——가 많이 쓰입니다. JavaScript의 Date.now()가 대표적인 예입니다.
흔한 혼동 포인트:1711670400(10자리)는 초, 1711670400000(13자리)는 밀리초입니다. 밀리초를 초로 잘못 처리하면 서기 5만 년경의 날짜가 출력됩니다. 구분법:10자리 = 초, 13자리 = 밀리초(2001〜2286년 범위에서 유효)。
5. 각 언어에서 Unix Timestamp 가져오기
# PHP
time() // 초
round(microtime(true) * 1000) // 밀리초
# Python
import time
int(time.time()) // 초
int(time.time() * 1000) // 밀리초
# JavaScript
Math.floor(Date.now() / 1000) // 초
Date.now() // 밀리초
# Java
System.currentTimeMillis() / 1000 // 초
System.currentTimeMillis() // 밀리초
# Go
time.Now().Unix() // 초
time.Now().UnixMilli() // 밀리초
# Bash / Shell
date +%s // 초
6. Unix Timestamp를 사람이 읽기 쉬운 형식으로 변환하려면?
각 언어에 표준 함수가 있습니다. PHP 예시:
// timestamp → 날짜 문자열
$ts = 1711670400;
echo date('Y-m-d H:i:s', $ts); // 서버 로컬 시각
echo gmdate('Y-m-d H:i:s', $ts); // UTC 강제
// 날짜 문자열 → timestamp
$ts = strtotime('2024-03-29 00:00:00 UTC'); // 1711670400
7. 2038년 문제 (Y2K38)
Unix timestamp를 32비트 부호 있는 정수(signed int32)로 저장하면 최댓값은 2147483647이고, 이는 2038년 1월 19일 03:14:07 UTC에 해당합니다. 이 시각을 넘으면 정수 오버플로 후 음수가 되어 1901년으로 시스템이 잘못 인식합니다. 이를 "2038년 문제(Y2038 problem)"라고 합니다.
현대 운영체제(Linux 커널 5.6+)와 대부분의 64비트 언어는 64비트 정수로 전환하여 약 2920억 년 이후까지 표현 가능합니다. 그러나 구형 32비트 C 라이브러리나 DB의 INT(11) 컬럼을 사용하는 시스템은 마이그레이션을 검토해야 합니다.
INT UNSIGNED는 2106년까지, BIGINT는 사실상 상한이 없습니다. 신규 시스템에는 BIGINT 또는 DB 네이티브 DATETIME/TIMESTAMP 타입(내부적으로 64비트 사용)을 권장합니다.
8. 주요 활용 사례
- DB 시각 기록:
created_at·updated_at·deleted_at컬럼에 timestamp를 사용하면 저장 공간 효율과 쿼리 성능이 향상됩니다. - API 응답:REST API에서 시각을 전달할 때 timestamp를 사용하면 숫자 비교와 정렬이 쉬워집니다.
- JWT·인증 토큰:JSON Web Token의
exp(만료 시각)과iat(발급 시각)는 Unix timestamp입니다. - 로그 시스템:timestamp로 이벤트를 기록하면 시간 범위 필터링이 간편합니다.
- 프론트엔드 상대 시각 표시:"3분 전"·"어제" 같은 상대 시각은
Date.now()에서 API로 받은 timestamp를 빼서 계산합니다.
마무리
Unix timestamp는 그저 숫자처럼 보이지만, 현대 소프트웨어 생태계 전체를 지탱하는 공통 시간 언어입니다. 1970년을 기점으로 하는 절대 초 수·타임존 비의존·순수 정수 연산이라는 원리를 이해하면, API 문서 해독·시간 관련 버그 디버깅·견고한 시스템 설계에 바로 활용할 수 있습니다. 다음에 10자리 숫자를 보면 "초", 13자리면 "밀리초"——그리고 그 배경에는 1970년 1월 1일 00:00:00 UTC라는 조용한 기준점이 있음을 기억하세요.