🕐
← 가이드 목록으로

여러 Unix 타임스탬프를 한 번에 변환하는 방법

· 태그: batch-processing, log-analysis, automation, unix-timestamp, shell-scripting, data-processing

타임스탬프를 배치 변환해야 하는 이유

서버 로그, 데이터베이스 내보내기, API 응답, 분석 데이터셋을 다룰 때 한 번에 하나의 타임스탬프만 만나는 경우는 거의 없습니다. 실제 데이터는 종종 파일, 열, JSON 페이로드에 수천 또는 수백만 개의 Unix 타임스탬프가 흩어져 있습니다. 각각을 수동으로 변환하는 것은 비현실적입니다. 배치 처리는 원시 숫자의 산을 읽을 수 있는 타임라인으로 바꿔줍니다.

이 가이드는 명령줄 도구, 스크립트, 저희 온라인 도구를 사용하여 여러 타임스탬프를 변환하는 실용적인 접근 방식을 다룹니다.

방법 1: 온라인 배치 변환기 사용하기

저희 Unix Timestamp Converter는 배치 입력을 지원합니다. 여러 타임스탬프를 붙여넣으면(한 줄에 하나씩 또는 쉼표로 구분) 도구가 모든 타임스탬프를 한 번에 변환하여 시간대별로 정렬된 표로 결과를 표시합니다.

이 방법은 수십에서 수백 개의 타임스탬프 — 코드를 작성하지 않고 빠르고 시각적인 결과가 필요할 때 — 중간 규모의 배치에 이상적입니다.

방법 2: 명령줄 배치 처리

date 명령어를 사용한 기본 루프

# bash 루프를 사용하여 타임스탬프 목록 변환
for ts in 1785292800 1785379200 1785465600 1785552000; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

파일에서 읽기

# timestamps.txt에는 한 줄에 하나의 타임스탬프가 포함되어 있습니다
while read -r ts; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done < timestamps.txt

병렬 처리를 위한 xargs 사용

# 대용량 파일의 경우 여러 프로세스로 xargs 사용
cat timestamps.txt | xargs -P 4 -I {} date -d "@{}" "+%Y-%m-%d %H:%M:%S"

CSV 파일로 출력

# 원본 타임스탬프와 변환된 날짜로 CSV 생성
echo "timestamp,date_utc,date_local" > output.csv
while read -r ts; do
    utc_date=$(TZ=UTC date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
    local_date=$(date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
    echo "$ts,$utc_date,$local_date" >> output.csv
done < timestamps.txt

방법 3: 로그 파일에서 타임스탬프 추출하기

로그 파일에는 종종 구조화되거나 반구조화된 텍스트에 타임스탬프가 포함되어 있습니다. 다음은 일반적인 로그 형식에 대한 실용적인 기술입니다.

Apache / Nginx 액세스 로그

Apache 및 Nginx 로그는 종종 %{%Y-%m-%d}T 형식을 사용하거나, 구성된 경우 Unix 타임스탬프를 사용합니다:

# Nginx 로그에서 타임스탬프 추출 및 변환
# 로그 줄에는 다음이 포함될 수 있습니다: [1785292800] GET /index.html 200
grep -oP '\[\K[0-9]{10}(?=\])' access.log | while read -r ts; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

JSON 로그

현대 애플리케이션은 종종 JSON 형식으로 로그를 기록합니다:

# jq를 사용하여 JSON 로그 파일에서 타임스탬프 추출
cat app.log | jq -r '.timestamp' | while read -r ts; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

사용자 지정 구분자 로그

# 타임스탬프가 로그의 첫 번째 필드인 경우 (파이프로 구분)
awk -F'|' '{ts=$1; cmd="date -d @" ts " \"+%Y-%m-%d %H:%M:%S\""; cmd | getline date; close(cmd); print date, $0}' server.log

방법 4: Python을 사용한 고급 배치 처리

Python은 배치 변환에 가장 유연한 도구로, 특히 타임스탬프에 필터링, 변환, 내보내기가 필요할 때 유용합니다.

타임스탬프 목록 변환

from datetime import datetime
import json

timestamps = [1785292800, 1785379200, 1785465600, 1785552000]

results = []
for ts in timestamps:
    dt = datetime.utcfromtimestamp(ts)
    results.append({
        "timestamp": ts,
        "datetime_utc": dt.strftime("%Y-%m-%d %H:%M:%S"),
        "date": dt.strftime("%Y-%m-%d"),
        "time": dt.strftime("%H:%M:%S"),
        "day_of_week": dt.strftime("%A"),
    })

print(json.dumps(results, indent=2))

CSV 파일 처리

import csv
from datetime import datetime

with open("data.csv", "r") as infile, open("converted.csv", "w", newline="") as outfile:
    reader = csv.DictReader(infile)
    writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames + ["date_utc", "date_local"])
    writer.writeheader()
    
    for row in reader:
        ts = int(row["timestamp"])
        dt_utc = datetime.utcfromtimestamp(ts)
        row["date_utc"] = dt_utc.strftime("%Y-%m-%d %H:%M:%S")
        
        # 여기를 자신의 로컬 시간대로 교체할 수 있습니다
        from datetime import timezone
        dt_local = datetime.fromtimestamp(ts, tz=timezone.utc).astimezone()
        row["date_local"] = dt_local.strftime("%Y-%m-%d %H:%M:%S %Z")
        
        writer.writerow(row)

print("Conversion complete. Output written to converted.csv")

날짜 범위로 필터링

from datetime import datetime

# 범위 정의: 2026년 7월의 시작과 끝
start_ts = int(datetime(2026, 7, 1).timestamp())
end_ts   = int(datetime(2026, 7, 31, 23, 59, 59).timestamp())

timestamps = [1785292800, 1785379200, 1785465600, 1785552000,
              1234567890, 1000000000]

# 2026년 7월만 필터링
july_only = [ts for ts in timestamps if start_ts <= ts <= end_ts]

for ts in july_only:
    dt = datetime.utcfromtimestamp(ts)
    print(f"{ts} -> {dt.strftime('%Y-%m-%d %H:%M:%S')}")

방법 5: awk를 사용한 스트리밍 변환

매우 큰 파일(수백만 행)의 경우, awk는 모든 것을 메모리에 로드하지 않고 데이터를 스트림으로 처리합니다:

#!/usr/bin/awk -f
# batch-convert.awk
# 첫 번째 필드를 Unix 타임스탬프로 변환하고, 날짜와 함께 모든 필드를 출력합니다

{
    ts = $1
    # awk의 mktime은 "YYYY MM DD HH MM SS" 형식을 기대합니다
    # 변환을 위해 date 명령어를 통해 셸을 호출합니다
    cmd = "date -d @" ts " \"+%Y-%m-%d %H:%M:%S\""
    cmd | getline date
    close(cmd)
    print date, $0
}

사용법:

./batch-convert.awk server.log

방법 6: 데이터베이스 타임스탬프에 SQL 사용하기

타임스탬프가 데이터베이스에 있다면 SQL이 작업을 처리하도록 하세요:

PostgreSQL

SELECT 
    id,
    event_time,
    to_timestamp(event_time) AS readable_time,
    to_char(to_timestamp(event_time), 'YYYY-MM-DD HH24:MI:SS') AS formatted_time
FROM events
WHERE to_timestamp(event_time) >= '2026-07-01';

MySQL

SELECT 
    id,
    event_time,
    FROM_UNIXTIME(event_time) AS readable_time,
    FROM_UNIXTIME(event_time, '%Y-%m-%d %H:%i:%s') AS formatted_time
FROM events
WHERE FROM_UNIXTIME(event_time) >= '2026-07-01';

SQLite

SELECT 
    id,
    event_time,
    datetime(event_time, 'unixepoch') AS readable_time,
    strftime('%Y-%m-%d %H:%M:%S', event_time, 'unixepoch') AS formatted_time
FROM events;

출력 테이블 서식 지정

# 열 헤더가 있는 깔끔한 형식의 테이블 생성
convert() {
    printf "%-15s %-25s %-25s\n" "TIMESTAMP" "UTC" "LOCAL"
    printf "%-15s %-25s %-25s\n" "---------------" "-------------------------" "-------------------------"
    while read -r ts; do
        utc=$(TZ=UTC date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
        local=$(date -d @"$ts" "+%Y-%m-%d %H:%M:%S")
        printf "%-15s %-25s %-25s\n" "$ts" "$utc" "$local"
    done <<< "$(cat "$1")"
}

성능 비교

| 방법 | 적합한 용도 | 속도 (10K 타임스탬프) | 복잡성 | |--------|----------|----------------------|------------| | 온라인 변환기 | 소규모 배치 (< 50) | 즉시 | 없음 | | Bash 루프 | 소-중규모 (50-10K) | ~30초 | 낮음 | | xargs 병렬 | 중규모 (10K-100K) | ~10초 | 낮음 | | Python | 모든 규모 | ~2초 | 중간 | | awk 스트림 | 매우 대규모 (수백만) | ~5초 | 중간 | | SQL | 데이터베이스 데이터 | 즉시 | 낮음 |

빠른 일상적인 배치에는 저희 Unix Timestamp Converter를 사용하세요. 자동화 및 대규모 데이터셋에는 워크플로우에 맞는 프로그래밍 방식을 사용하여 변환을 스크립팅하세요.