Epoch Time이 정확히 뭔가요?
프로그래밍에서 날짜와 시간을 다뤄봤다면 Unix 타임스탬프를 접해봤을 거예요. 그런데 이게 정확히 뭐고, 왜 사용하는 걸까요?
Unix epoch time (Unix time, POSIX time, 또는 간단히 "epoch"이라고도 불려요)은 1970년 1월 1일 자정 UTC (협정 세계시) 이후 경과한 초 단위 숫자로 특정 시점을 나타내요. 이 특정 순간을 "Unix epoch" 또는 "epoch zero"라고 해요.
왜 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에 도달하면 이 카운터가 오버플로우되어 음수로 돌아가면서 시스템 오류와 버그를 발생시킬 수 있어요.
현재 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 도구를 사용해서 타임스탬프와 읽을 수 있는 날짜 간에 빠르게 변환해보세요!