🕐
← 가이드 목록으로

프로그래밍 언어에서 Unix 타임스탬프 다루기

· 태그: javascript, python, php, golang, programming, unix-timestamp, epoch, database

프로그래밍에서 Unix 타임스탬프를 사용하는 이유

Unix 타임스탬프는 소프트웨어에서 시간을 다루는 보편적인 기준입니다. 날짜 연산을 간단하게 만들고(단순히 초를 더하거나 빼면 됨), 시간대 혼란을 없애며, JSON으로 깔끔하게 직렬화됩니다. 모든 프로그래밍 언어는 타임스탬프를 다루기 위한 간단한 함수를 제공하지만, API는 미묘하게 다릅니다. 이 가이드는 가장 일반적인 언어와 모범 사례를 다룹니다.

JavaScript (브라우저 및 Node.js)

JavaScript는 Date 객체에 밀리초를 사용하지만, 대부분의 다른 시스템은 초를 사용합니다. 이것이 가장 흔한 버그의 원인입니다.

현재 타임스탬프 가져오기

// 에포크 이후 밀리초 (표준 JavaScript)
const nowMs = Date.now();         // 1785292800000

// 에포크 이후 초(호환성 용도)
const nowSec = Math.floor(Date.now() / 1000);  // 1785292800

// Node.js 고해상도 타이머(마이크로초)
const hrTime = process.hrtime.bigint();

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

// 초 단위에서 변환 (대부분의 API 및 데이터베이스)
const timestamp = 1785292800;
const date = new Date(timestamp * 1000);  // 1000을 곱하세요!

// 밀리초 단위에서 변환 (JavaScript 기본)
const dateFromMs = new Date(1785292800000);

// 결과 서식 지정
console.log(date.toISOString());
// Output: 2026-07-19T00:00:00.000Z

console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// Output: 7/18/2026, 8:00:00 PM

날짜 문자열을 타임스탬프로 파싱하기

// Date.parse() 사용 (밀리초 반환)
const ms = Date.parse("2026-07-19T00:00:00Z");
const sec = ms / 1000;  // 1785292800

// Date 생성자 사용
const ts = Math.floor(new Date("2026-07-19 UTC").getTime() / 1000);

주의: Date.parse()의 동작은 비표준 날짜 문자열에 대해 브라우저마다 다릅니다. 시간대 지정자(Z for UTC)와 함께 ISO 8601 형식을 사용하는 것이 가장 안전합니다.

JavaScript에서 시간대 다루기

// 특정 시간대로 서식 지정
const date = new Date(1785292800 * 1000);
const options = {
  timeZone: "Asia/Tokyo",
  year: "numeric", month: "2-digit", day: "2-digit",
  hour: "2-digit", minute: "2-digit", second: "2-digit",
};
console.log(date.toLocaleString("ja-JP", options));
// Output: 07/19/2026 09:00:00

고급 시간대 작업에는 Intl.DateTimeFormat API 또는 date-fns-tz, Luxon과 같은 라이브러리를 사용하는 것이 좋습니다.

Python

Python은 타임스탬프 작업을 위한 저수준(time) 및 고수준(datetime) 모듈을 모두 제공합니다.

현재 타임스탬프 가져오기

import time

# 소수 초(float, 소수점 이하 밀리초 포함)
current = time.time()
# 예: 1785292800.123456

# 정수로
current_int = int(time.time())

타임스탬프를 Datetime으로 변환하기

from datetime import datetime

# UTC datetime (Python 3.x)
dt_utc = datetime.utcfromtimestamp(1785292800)

# 시간대 인식 datetime (Python 3.9+ with zoneinfo)
from zoneinfo import ZoneInfo
dt_tokyo = datetime.fromtimestamp(1785292800, tz=ZoneInfo("Asia/Tokyo"))

# 서식이 지정된 문자열
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))
# Output: 2026-07-19 00:00:00

날짜 문자열을 타임스탬프로 파싱하기

import time
from datetime import datetime

# 날짜 문자열에서 변환
dt = datetime.strptime("2026-07-19 00:00:00", "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(dt.timetuple())  # 로컬 시간으로 처리됨

# UTC 입력의 경우
from datetime import timezone
timestamp_utc = dt.replace(tzinfo=timezone.utc).timestamp()

Pandas로 작업하기 (데이터 분석)

import pandas as pd

# Unix 타임스탬프 열을 datetime으로 변환
df["timestamp"] = pd.to_datetime(df["unix_seconds"], unit="s")

# 다른 단위로 변환
df["datetime_ms"] = pd.to_datetime(df["unix_milliseconds"], unit="ms")

# 시간대 설정
df["timestamp_ny"] = df["timestamp"].dt.tz_localize("UTC").dt.tz_convert("America/New_York")

PHP

PHP는 타임스탬프 작업에 가장 간단한 API를 제공합니다.

현재 타임스탬프 가져오기

<?php
$now = time();           // 정수: 1785292800
$nowMicro = microtime();  // 문자열: "0.12345600 1785292800"
$nowFloat = microtime(true);  // Float: 1785292800.1235

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

<?php
echo date("Y-m-d H:i:s", 1785292800);
// Output: 2026-07-19 00:00:00

// 시간대 포함
$tz = new DateTimeZone("Europe/London");
$dt = new DateTime("@1785292800");
$dt->setTimezone($tz);
echo $dt->format("Y-m-d H:i:s");

Go

Go의 time 패키지는 잘 설계되어 있지만, 관련된 타입에 대한 명확한 이해가 필요합니다.

현재 타임스탬프 가져오기

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    sec := now.Unix()            // int64 초
    milli := now.UnixMilli()     // int64 밀리초
    nano := now.UnixNano()       // int64 나노초
    fmt.Printf("Seconds: %d\n", sec)
}

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

t := time.Unix(1785292800, 0)
fmt.Println(t.UTC())
// Output: 2026-07-19 00:00:00 +0000 UTC

// 문자열로 서식 지정
fmt.Println(t.Format("2006-01-02 15:04:05"))
// Output: 2026-07-19 00:00:00

// 시간대 포함
loc, _ := time.LoadLocation("America/Chicago")
fmt.Println(t.In(loc))

Rust

use std::time::{SystemTime, UNIX_EPOCH};

// 현재 타임스탬프
let now = SystemTime::now()
    .duration_since(UNIX_EPOCH)
    .expect("Time went backwards");
println!("Seconds: {}", now.as_secs());

// 타임스탬프를 날짜로 변환
let dt = chrono::NaiveDateTime::from_timestamp_opt(1785292800, 0).unwrap();
println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));

데이터베이스 저장: 모범 사례

올바른 열 유형 선택하기

| 데이터베이스 | 권장 유형 | 참고 | |----------|-----------------|-------| | PostgreSQL | TIMESTAMP WITH TIME ZONE 또는 BIGINT | 네이티브 타임스탬프 유형이 선호됨 | | MySQL / MariaDB | INT UNSIGNED(2106년까지의 날짜) 또는 BIGINT | TIMESTAMP 유형(범위가 2038년에서 끝남) 피할 것 | | SQLite | INTEGER | SQLite에는 네이티브 타임스탬프 유형이 없음 | | MongoDB | Date 객체 또는 int64 | BSON Date는 내부적으로 64비트 타임스탬프 |

PostgreSQL 예제

-- 네이티브 타임스탬프로 저장
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    occurred_at TIMESTAMP WITH TIME ZONE NOT NULL,
    payload JSONB
);

-- 현재 시간으로 삽입
INSERT INTO events (occurred_at) VALUES (NOW());

-- Unix 타임스탬프로 조회
SELECT EXTRACT(EPOCH FROM occurred_at) AS unix_ts FROM events;

MySQL 예제

-- 미래에도 안전한 저장을 위해 BIGINT 사용
CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time BIGINT NOT NULL,
    message TEXT
);

-- 현재 타임스탬프 삽입
INSERT INTO logs (event_time, message) VALUES (UNIX_TIMESTAMP(), 'Server started');

-- 조회 및 변환
SELECT FROM_UNIXTIME(event_time) AS readable_time FROM logs;

언어 비교 표

| 언어 | 현재 타임스탬프 | 타임스탬프 → 날짜 | 날짜 → 타임스탬프 | 해상도 | |----------|-------------------|-------------------|-------------------|------------| | JavaScript | Date.now() | new Date(ts * 1000) | Date.parse(str) / 1000 | 밀리초 | | Python | time.time() | datetime.fromtimestamp(ts) | datetime.strptime(str).timestamp() | 소수 초 | | PHP | time() | date("Y-m-d", ts) | strtotime(str) | 초 | | Go | time.Now().Unix() | time.Unix(ts, 0) | time.Parse(layout, str).Unix() | 초 | | Rust | SystemTime::now() | NaiveDateTime::from_timestamp_opt() | — | 다양함 |

어떤 언어를 사용하든, 저희 Unix Timestamp Converter는 빠른 확인 및 디버깅을 위한 신뢰할 수 있는 동반 도구입니다.