🕐
← กลับไปคู่มือ

วิธีแปลง Unix Timestamp หลายค่าพร้อมกัน

· แท็ก: batch-processing, log-analysis, automation, unix-timestamp, shell-scripting, data-processing

ทำไมต้องแปลง Timestamp แบบกลุ่ม?

เมื่อคุณทำงานกับ server logs, การส่งออกฐานข้อมูล, การตอบกลับ API หรือชุดข้อมูลวิเคราะห์ คุณแทบจะไม่เคยพบ timestamp ทีละค่าเลย ข้อมูลในโลกจริงมักมี Unix timestamp นับพันหรือนับล้านกระจายอยู่ทั่วไฟล์ คอลัมน์ หรือ JSON payload การแปลงแต่ละค่าด้วยตนเองนั้นทำไม่ได้จริง การประมวลผลแบบกลุ่มเปลี่ยนภูเขาของตัวเลขดิบให้เป็นเส้นเวลาที่อ่านได้

คู่มือนี้นำเสนอวิธีการที่ใช้งานได้จริงสำหรับการแปลง timestamp หลายค่าพร้อมกันโดยใช้เครื่องมือ command-line, สคริปต์ และเครื่องมือออนไลน์ของเรา

วิธีที่ 1: ใช้ตัวแปลงแบบกลุ่มออนไลน์

Unix Timestamp Converter ของเรารองรับการป้อนข้อมูลแบบกลุ่ม วาง timestamp หลายค่า (หนึ่งค่าต่อบรรทัดหรือคั่นด้วยเครื่องหมายจุลภาค) และเครื่องมือจะแปลงทั้งหมดในครั้งเดียว แสดงผลลัพธ์ในตารางที่เรียงตามเขตเวลา

วิธีนี้เหมาะสำหรับกลุ่มขนาดปานกลาง — หลายสิบถึงหลายร้อย timestamp — ที่คุณต้องการผลลัพธ์ที่รวดเร็วและมองเห็นได้โดยไม่ต้องเขียนโค้ด

วิธีที่ 2: การประมวลผลแบบกลุ่มด้วย Command-Line

ลูปพื้นฐานด้วยคำสั่ง date

# แปลงรายการ timestamp โดยใช้ bash loop
for ts in 1785292800 1785379200 1785465600 1785552000; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

อ่านจากไฟล์

# timestamps.txt มีหนึ่ง timestamp ต่อบรรทัด
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 พร้อม timestamp ต้นฉบับและวันที่ที่แปลงแล้ว
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: การแยก Timestamp จากไฟล์ล็อก

ไฟล์ล็อกมักมี timestamp ฝังอยู่ในข้อความที่มีโครงสร้างหรือกึ่งโครงสร้าง นี่คือเทคนิคที่ใช้งานได้จริงสำหรับรูปแบบล็อกทั่วไป

Apache / Nginx Access Logs

Apache และ Nginx logs มักใช้รูปแบบ %{%Y-%m-%d}T หรือหากกำหนดค่าไว้ จะใช้ Unix timestamp:

# แยกและแปลง timestamp จาก Nginx log
# บรรทัดล็อกอาจมี: [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 Logs

แอปพลิเคชันสมัยใหม่มักบันทึกล็อกในรูปแบบ JSON:

# ใช้ jq เพื่อแยก timestamp จากไฟล์ล็อก JSON
cat app.log | jq -r '.timestamp' | while read -r ts; do
    date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
done

ล็อกที่คั่นด้วยตัวคั่นแบบกำหนดเอง

# หาก timestamp เป็นฟิลด์แรกในล็อก (คั่นด้วย pipe)
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 เป็นเครื่องมือที่ยืดหยุ่นที่สุดสำหรับการแปลงแบบกลุ่ม โดยเฉพาะเมื่อ timestamp ต้องการการกรอง การแปลง หรือการส่งออก

แปลงรายการ Timestamp

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("การแปลงเสร็จสมบูรณ์ ผลลัพธ์ถูกเขียนไปยัง converted.csv")

กรองตามช่วงวันที่

from datetime import datetime

# กำหนดช่วง: เริ่มต้นและสิ้นสุดเดือนกรกฎาคม 2026
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
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 timestamp พิมพ์ทุกฟิลด์พร้อมวันที่

{
    ts = $1
    # mktime ของ awk คาดหวังรูปแบบ "YYYY MM DD HH MM SS"
    # เราเรียก shell เพื่อแปลงผ่านคำสั่ง 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 สำหรับ Timestamp ในฐานข้อมูล

หาก timestamp ของคุณอยู่ในฐานข้อมูล ให้ 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 timestamp) | ความซับซ้อน | |--------|----------|----------------------|------------| | ตัวแปลงออนไลน์ | กลุ่มเล็ก (< 50) | ทันที | ไม่มี | | Bash loop | ขนาดเล็ก-กลาง (50-10K) | ~30 วินาที | ต่ำ | | xargs แบบขนาน | กลาง (10K-100K) | ~10 วินาที | ต่ำ | | Python | ทุกขนาด | ~2 วินาที | ปานกลาง | | awk stream | ขนาดใหญ่มาก (ล้าน) | ~5 วินาที | ปานกลาง | | SQL | ข้อมูลฐานข้อมูล | ทันที | ต่ำ |

สำหรับการแปลงแบบกลุ่มในชีวิตประจำวัน ใช้ Unix Timestamp Converter ของเรา สำหรับระบบอัตโนมัติและชุดข้อมูลขนาดใหญ่ เขียนสคริปต์การแปลงด้วยวิธีการเขียนโปรแกรมที่ตรงกับเวิร์กโฟลว์ของคุณ