로그 파일에서 1712265600을 보고 이게 실제로 몇 시인지 생각해본 적이 있을 것입니다. Unix 타임스탬프는 소프트웨어에서 시간의 공용어입니다 — 간결하고, 명확하며, 타임존에 무관합니다. 이 글에서는 작동 원리와 계산기 없이 변환하는 방법을 설명합니다.
Unix 타임스탬프란?
Unix 타임스탬프(에포크 시간)는 **1970년 1월 1일 00:00:00 UTC(Unix 에포크)**로부터 경과한 초 수입니다. 이 기준점은 Unix가 설계될 때 다소 임의적으로 선택되었지만, 컴퓨터 시스템에서 시간을 표현하는 범용 표준이 되었습니다.
0 → 1970-01-01 00:00:00 UTC
1712265600 → 2024-04-05 00:00:00 UTC
핵심 특성:
- 타임존 무관: 타임스탬프는 항상 UTC. 현지 시간으로 변환하려면 타임존이 필요
- 단조 증가: 숫자가 클수록 나중 시점
- 정수 연산: 타임스탬프 비교는 단순히 정수 비교
즉시 타임스탬프 변환하기
Unix 타임스탬프를 입력하면 UTC와 현지 시간을 모두 확인할 수 있습니다. 날짜를 입력하면 해당 타임스탬프를 얻을 수 있습니다. 밀리초, 초, 상대적 오프셋을 모두 처리합니다.
초 vs 밀리초
API마다 일관성이 없습니다. JavaScript는 밀리초 (Date.now()는 ms 반환). Unix 커맨드라인 도구와 대부분의 데이터베이스 타임스탬프는 초를 사용. Redis, MongoDB, 많은 REST API는 밀리초를 사용합니다.
초 단위 타임스탬프: 1712265600
밀리초 단위 타임스탬프: 1712265600000
타임스탬프를 받을 때, 현재 시간과 대략적으로 일치하는지 확인하세요. 예상보다 1000배 크면 밀리초입니다. ZeroTool 변환기는 두 형식을 모두 처리합니다.
현재 타임스탬프 가져오기
# Bash — 초
date +%s
# Bash — 밀리초 (GNU date)
date +%s%3N
// JavaScript — 밀리초
Date.now()
// JavaScript — 초
Math.floor(Date.now() / 1000)
# Python — 초 (float)
import time
time.time()
# Python — 초 (정수)
int(time.time())
코드에서 타임스탬프 변환하기
JavaScript
// 타임스탬프 → 날짜
const ts = 1712265600; // 초
const date = new Date(ts * 1000); // 밀리초로 변환
console.log(date.toISOString());
// "2024-04-05T00:00:00.000Z"
console.log(date.toLocaleString('ko-KR', { timeZone: 'Asia/Seoul' }));
// "2024. 4. 5. 오전 9:00:00" (서울은 UTC+9)
// 날짜 → 타임스탬프
const timestamp = Math.floor(new Date('2024-04-05').getTime() / 1000);
console.log(timestamp); // 1712275200
Python
from datetime import datetime, timezone
# 타임스탬프 → datetime (UTC)
ts = 1712265600
dt = datetime.fromtimestamp(ts, tz=timezone.utc)
print(dt.isoformat())
# 2024-04-05 00:00:00+00:00
# 타임스탬프 → datetime (현지 타임존)
dt_local = datetime.fromtimestamp(ts)
print(dt_local)
# datetime → 타임스탬프
from datetime import datetime, timezone
dt = datetime(2024, 4, 5, 0, 0, 0, tzinfo=timezone.utc)
print(int(dt.timestamp())) # 1712265600
Go
import (
"fmt"
"time"
)
// 타임스탬프 → time.Time
ts := int64(1712265600)
t := time.Unix(ts, 0).UTC()
fmt.Println(t.Format(time.RFC3339))
// 2024-04-05T00:00:00Z
// time.Time → 타임스탬프
timestamp := t.Unix()
fmt.Println(timestamp) // 1712265600
SQL
-- PostgreSQL: 타임스탬프 → 사람이 읽을 수 있는 형태
SELECT to_timestamp(1712265600) AT TIME ZONE 'UTC';
-- 2024-04-05 00:00:00+00
-- MySQL: 타임스탬프 → 사람이 읽을 수 있는 형태
SELECT FROM_UNIXTIME(1712265600);
-- 2024-04-05 00:00:00
-- 현재 타임스탬프
SELECT EXTRACT(EPOCH FROM now())::int; -- PostgreSQL
SELECT UNIX_TIMESTAMP(); -- MySQL
타임존 처리
Unix 타임스탬프는 항상 UTC입니다. 현지 시간으로 변환하려면 타임존 식별자가 필요합니다:
from datetime import datetime
import zoneinfo
ts = 1712265600
# 서울 시간 (UTC+9)
dt = datetime.fromtimestamp(ts, tz=zoneinfo.ZoneInfo("Asia/Seoul"))
print(dt.isoformat())
# 2024-04-05T09:00:00+09:00
# 뉴욕 시간
dt = datetime.fromtimestamp(ts, tz=zoneinfo.ZoneInfo("America/New_York"))
print(dt.isoformat())
# 2024-04-04T20:00:00-04:00
흔한 실수: 타임존 없이 datetime.fromtimestamp(ts)를 사용하면 서버의 현지 타임존을 사용합니다. 운영 환경에서 비결정적 동작을 유발합니다. 항상 타임존을 명시적으로 지정하세요.
2038년 문제
32비트 부호 있는 정수로 저장된 Unix 타임스탬프는 2038년 1월 19일 03:14:07 UTC에 오버플로우합니다 — 32비트 정수의 최대값(2,147,483,647)을 초과합니다.
현대 시스템은 수십억 년 후에나 오버플로우되는 64비트 정수를 사용합니다. 하지만 임베디드 시스템, 레거시 데이터베이스, 일부 C 코드는 여전히 32비트 타임스탬프를 사용할 수 있습니다. 오랫동안 운영될 시스템을 작업할 때는 타임스탬프 필드가 64비트인지 확인하세요.
ISO 8601: 사람이 읽을 수 있는 대안
ISO 8601은 날짜와 시간을 문자열로 표현하는 국제 표준입니다:
2024-04-05T00:00:00Z UTC
2024-04-05T09:00:00+09:00 서울
2024-04-05T00:00:00.000Z 밀리초 정밀도
ISO 8601 문자열은 사전식으로 올바른 순서로 정렬되며 로케일에 상관없이 명확합니다. 로그, API, 사용자 대면 타임스탬프에는 Unix 타임스탬프보다 ISO 8601을 선호하세요.
new Date().toISOString()
// "2024-04-05T00:00:00.000Z"
from datetime import datetime, timezone
datetime.now(timezone.utc).isoformat()
# "2024-04-05T00:00:00.000000+00:00"
기간 연산
const ONE_HOUR = 3600; // 초
const ONE_DAY = 86400;
const ONE_WEEK = 604800;
// 지금부터 일주일 후
const nextWeek = Math.floor(Date.now() / 1000) + ONE_WEEK;
// 두 타임스탬프 사이의 일수
const diff = Math.abs(ts2 - ts1);
const days = Math.floor(diff / 86400);
타임스탬프 형식 비교
| 형식 | 예시 | 비고 |
|---|---|---|
| Unix 초 | 1712265600 | 10자리 (2286년까지) |
| Unix 밀리초 | 1712265600000 | 13자리 |
| ISO 8601 UTC | 2024-04-05T00:00:00Z | API에 최적 |
| ISO 8601 오프셋 포함 | 2024-04-05T09:00:00+09:00 | 타임존 포함 |
| RFC 2822 | Fri, 05 Apr 2024 00:00:00 +0000 | 이메일 헤더 |
요약
Unix 타임스탬프는 소프트웨어 시간의 기반입니다. 핵심 규칙:
- 항상 UTC로 작업 — 표시 레이어에서만 현지 시간으로 변환
- API가 초를 반환하는지 밀리초를 반환하는지 파악하기
- 타임스탬프에 64비트 정수 사용 (32비트는 2038년에 오버플로우)
- 타임존을 명시적으로 지정 — 서버 현지 타임존에 의존하지 말기
- API와 로그에는 ISO 8601 선호 (사람이 읽기 편함)