Unix 타임스탬프 완전 이해

Unix 타임스탬프란?

Unix 타임스탬프(POSIX 시간 또는 Epoch 시간이라고도 불림)는 1970년 1월 1일 00:00:00 UTC — Unix Epoch라 불리는 기준점 — 이후 경과된 초 수를 나타내는 정수입니다. 예를 들어, 1700000000은 2023년 11월 14일 22:13:20 UTC에 해당합니다.

왜 1970년인가?

Unix 계열 운영체제는 1960년대 말~1970년대 초에 개발되었습니다. 1970년은 Unix의 탄생 시점과 가까운 편리한 기준점으로 선택되었습니다. 천문학적이거나 정치적인 의미는 없고 순전히 실용적인 이유였습니다.

주요 특징

  • 항상 UTC: Unix 타임스탬프는 시간대에 무관하며, 서버나 클라이언트 위치와 관계없이 항상 UTC를 기준으로 합니다.
  • 정수 또는 실수: 초 단위는 정수, 밀리초 이하 정밀도가 필요하면 부동소수점(예: 1700000000.456)을 사용합니다.
  • 밀리초 변형: JavaScript의 Date.now()는 초가 아닌 밀리초를 반환합니다 — 단위를 항상 확인하세요.
  • 윤초 무시: Unix 타임스케일은 윤초를 무시하므로 윤초 삽입 시 실제 UTC와 약간 차이가 날 수 있습니다.

현재 타임스탬프 구하기

# Python
import time
print(int(time.time()))          # 예: 1700000000

# JavaScript
console.log(Math.floor(Date.now() / 1000))  // 초 단위

# Bash
date +%s

# SQL (PostgreSQL)
SELECT EXTRACT(EPOCH FROM NOW())::BIGINT;

타임스탬프를 날짜로 변환하기

# Python
from datetime import datetime, timezone
dt = datetime.fromtimestamp(1700000000, tz=timezone.utc)
print(dt.isoformat())   # 2023-11-14T22:13:20+00:00

# JavaScript
new Date(1700000000 * 1000).toISOString()
// "2023-11-14T22:13:20.000Z"

자주 하는 실수

  • 밀리초 vs 초: API가 밀리초를 반환하는지 초를 반환하는지 항상 확인하세요. 잘못 나누면 1970년 날짜가 나옵니다.
  • 32비트 오버플로: 32비트 정수를 사용하는 시스템에서는 2038년에 오버플로가 발생합니다. 2038년 문제 가이드를 참고하세요.
  • 음수 타임스탬프: 1970년 이전 날짜는 음수 정수로 표현되며 대부분의 현대 언어에서 올바르게 처리됩니다.

Unix 타임스탬프를 사용하는 경우

데이터베이스, API, 로그에서 날짜를 저장하고 비교할 때 Unix 타임스탬프가 이상적입니다. 간결하고 정렬 가능하며 시간대에 무관하고 모호하지 않습니다. 사용자에게 표시할 때는 항상 적절한 시간대로 변환하세요.