Unix 타임스탬프의 기초, 에포크 타임

Epoch Time이 정확히 뭔가요?

프로그래밍에서 날짜와 시간을 다뤄봤다면 Unix 타임스탬프를 접해봤을 거예요. 그런데 이게 정확히 뭐고, 왜 사용하는 걸까요?

Unix epoch time (Unix time, POSIX time, 또는 간단히 "epoch"이라고도 불려요)은 1970년 1월 1일 자정 UTC (협정 세계시) 이후 경과한 초 단위 숫자로 특정 시점을 나타내요. 이 특정 순간을 "Unix epoch" 또는 "epoch zero"라고 해요.

간단한 예시: 현재 Unix 타임스탬프가 1728773400이라면, 1970년 1월 1일 자정 이후 정확히 1,728,773,400초가 경과했다는 의미예요.

왜 1970년 1월 1일인가요?

이 날짜가 임의로 보일 수 있지만, 1970년대 초 Bell Labs에서 Unix를 개발할 때 선택된 거예요. 개발자들은 시간 추적 시스템을 위한 일관된 시작점이 필요했고, 1970년 1월 1일은 그들이 프로젝트를 진행하던 시기와 가까웠어요. 그 이후로 보편적인 표준이 되었죠.

형식 이해하기

Unix 타임스탬프는 필요한 정밀도에 따라 다양한 형식으로 제공돼요:

  • 초 (10자리): 표준 형식이에요, 1728773400 처럼요
  • 밀리초 (13자리): 더 높은 정밀도를 위해, 1728773400000 처럼요
  • 마이크로초 (16자리): 초정밀 타이밍을 위해, 1728773400000000 처럼요

일반적인 시간 간격 (초 단위)

이런 일반적인 간격을 이해하면 타임스탬프를 더 직관적으로 다룰 수 있어요:

시간 단위 간단한 계산
1시간 3,600 60 × 60
1일 86,400 24 × 3,600
1주 604,800 7 × 86,400
1개월 (평균) 2,629,743 30.44 × 86,400
1년 (평균) 31,556,926 365.24 × 86,400

2038년 문제 (Y2038)

중요한 점이 있어요: 많은 시스템이 Unix 타임스탬프를 32비트 부호 있는 정수로 저장해요. 이게 Y2K 버그와 비슷한 문제를 만들어요.

32비트 부호 있는 정수는 2,147,483,647초까지만 셀 수 있어요. 2038년 1월 19일 03:14:07 UTC에 도달하면 이 카운터가 오버플로우되어 음수로 돌아가면서 시스템 오류와 버그를 발생시킬 수 있어요.

중요: 최신 시스템은 64비트 타임스탬프로 전환하고 있어요. 이건 앞으로 2920억 년 동안은 오버플로우되지 않아요. 애플리케이션에서 타임스탬프 저장 시 64비트 정수를 사용하는지 확인하세요!

현재 Epoch Time 가져오기

모든 프로그래밍 언어는 현재 Unix 타임스탬프를 가져오는 고유한 방법이 있어요. 가장 일반적인 방법들이에요:

웹 개발

JavaScript

// 밀리초 단위로 타임스탬프를 가져와서 1000으로 나누면 초 단위
const timestamp = Math.floor(Date.now() / 1000);

// 대체 방법
const timestamp = Math.floor(new Date().getTime() / 1000);

PHP

// 간단하고 직관적
$timestamp = time();

// DateTime 사용 (더 유연함)
$timestamp = (new DateTime())->getTimestamp();

백엔드 언어

Python

import time

# 현재 타임스탬프 가져오기
timestamp = int(time.time())

# datetime 모듈 사용
from datetime import datetime
timestamp = int(datetime.now().timestamp())

Java

// 밀리초를 반환하므로 1000으로 나누면 초 단위
long timestamp = System.currentTimeMillis() / 1000;

// Instant 사용 (Java 8+)
long timestamp = Instant.now().getEpochSecond();

C#

// .NET Framework 4.6+ / .NET Core
long timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();

// 이전 버전
var epoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;

Ruby

# 현재 타임스탬프 가져오기
timestamp = Time.now.to_i

# 대체 방법
timestamp = Time.new.to_i

Go

import "time"

// 현재 Unix 타임스탬프 가져오기
timestamp := time.Now().Unix()

// 밀리초 단위
milliseconds := time.Now().UnixMilli()

데이터베이스 쿼리

MySQL

-- 현재 타임스탬프 가져오기
SELECT UNIX_TIMESTAMP();

-- 특정 날짜의 타임스탬프 가져오기
SELECT UNIX_TIMESTAMP('2025-10-12 14:30:00');

PostgreSQL

-- 현재 타임스탬프 가져오기
SELECT EXTRACT(EPOCH FROM NOW());

-- 특정 날짜에서
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2025-10-12 14:30:00');

SQLite

-- 현재 타임스탬프 가져오기
SELECT STRFTIME('%s', 'now');

-- 특정 날짜에서
SELECT STRFTIME('%s', '2025-10-12 14:30:00');

명령줄

Unix/Linux Shell

# 현재 타임스탬프 가져오기
date +%s

# 특정 날짜를 타임스탬프로 변환
date +%s -d "2025-10-12 14:30:00"

# UTC/GMT 시간의 경우 -d 대신 -ud 사용
date +%s -ud "2025-10-12 14:30:00"

PowerShell

# 현재 타임스탬프 가져오기
[int][double]::Parse((Get-Date (Get-Date).ToUniversalTime() -UFormat %s))

Epoch을 읽을 수 있는 날짜로 변환하기

Unix 타임스탬프를 얻으면 읽을 수 있는 날짜 형식으로 다시 변환해야 할 때가 많아요:

JavaScript

// 타임스탬프를 Date 객체로 변환
const date = new Date(timestamp * 1000); // 밀리초를 위해 1000을 곱해요

// 형식 지정
console.log(date.toLocaleString()); // 로컬 형식
console.log(date.toISOString());    // ISO 8601 형식

PHP

// 타임스탬프 형식 지정
$date = date('Y-m-d H:i:s', $timestamp);

// RFC 2822 형식
$date = date('r', $timestamp);

// DateTime 사용
$date = (new DateTime())->setTimestamp($timestamp)->format('Y-m-d H:i:s');

Python

from datetime import datetime

# datetime 객체로 변환
dt = datetime.fromtimestamp(timestamp)

# 형식 지정
formatted = dt.strftime('%Y-%m-%d %H:%M:%S')

# UTC의 경우
dt_utc = datetime.utcfromtimestamp(timestamp)

MySQL

-- 타임스탬프를 datetime으로 변환
SELECT FROM_UNIXTIME(1728773400);

-- 사용자 정의 형식으로
SELECT FROM_UNIXTIME(1728773400, '%Y-%m-%d %H:%i:%s');

읽을 수 있는 날짜를 Epoch으로 변환하기

반대 작업도 똑같이 중요해요:

JavaScript

// 날짜 문자열을 타임스탬프로 파싱
const timestamp = Math.floor(new Date('2025-10-12 14:30:00').getTime() / 1000);

// Date.parse() 사용
const timestamp = Math.floor(Date.parse('October 12, 2025') / 1000);

PHP

// 대부분의 영어 날짜 텍스트 파싱
$timestamp = strtotime('15 November 2025');
$timestamp = strtotime('next Monday');
$timestamp = strtotime('+1 week');

// DateTime 사용
$timestamp = (new DateTime('2025-10-12 14:30:00'))->getTimestamp();

Python

from datetime import datetime
import time

# 날짜 문자열 파싱
dt = datetime.strptime('2025-10-12 14:30:00', '%Y-%m-%d %H:%M:%S')
timestamp = int(dt.timestamp())

# UTC의 경우
import calendar
timestamp = calendar.timegm(time.strptime('2025-10-12 14:30:00', '%Y-%m-%d %H:%M:%S'))

모범 사례

애플리케이션에서 Unix 타임스탬프를 다룰 때:

  • 항상 64비트 정수를 사용하세요 Y2038 문제를 피하려면요
  • 데이터베이스에 타임스탬프를 UTC로 저장하세요, 표시할 때만 현지 시간으로 변환하세요
  • 정밀도를 일관되게 유지하세요 (초 vs 밀리초) 애플리케이션 전체에서요
  • 형식을 문서화하세요 – 초를 사용하는지 밀리초를 사용하는지 명확히 하세요
  • 시간대 인식 라이브러리를 고려하세요 복잡한 날짜/시간 작업을 위해요
  • 시간대 정보 없이 현지 시간을 타임스탬프로 저장하지 마세요

결론

Unix 타임스탬프는 모든 개발자가 이해해야 하는 프로그래밍의 기본 개념이에요. 모든 시스템과 프로그래밍 언어에서 작동하는 간단하고 보편적인 시간 표현 방법을 제공해요.

웹 애플리케이션을 구축하든, 데이터베이스를 다루든, 작업을 예약하든, epoch time을 이해하면 훨씬 쉬워질 거예요. Unix Timestamp Converter 도구를 사용해서 타임스탬프와 읽을 수 있는 날짜 간에 빠르게 변환해보세요!

지금 사용해보세요: 변환 도구로 가서 실시간으로 Unix 타임스탬프를 다뤄보세요!