로그 파일에서 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. 현지 시간으로 변환하려면 타임존이 필요
  • 단조 증가: 숫자가 클수록 나중 시점
  • 정수 연산: 타임스탬프 비교는 단순히 정수 비교

즉시 타임스탬프 변환하기

ZeroTool 타임스탬프 변환기 →

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 초171226560010자리 (2286년까지)
Unix 밀리초171226560000013자리
ISO 8601 UTC2024-04-05T00:00:00ZAPI에 최적
ISO 8601 오프셋 포함2024-04-05T09:00:00+09:00타임존 포함
RFC 2822Fri, 05 Apr 2024 00:00:00 +0000이메일 헤더

요약

Unix 타임스탬프는 소프트웨어 시간의 기반입니다. 핵심 규칙:

  1. 항상 UTC로 작업 — 표시 레이어에서만 현지 시간으로 변환
  2. API가 초를 반환하는지 밀리초를 반환하는지 파악하기
  3. 타임스탬프에 64비트 정수 사용 (32비트는 2038년에 오버플로우)
  4. 타임존을 명시적으로 지정 — 서버 현지 타임존에 의존하지 말기
  5. API와 로그에는 ISO 8601 선호 (사람이 읽기 편함)

ZeroTool로 Unix 타임스탬프를 읽기 쉬운 날짜로 변환하기 →