การทำงานกับ Unix Timestamp ในภาษาโปรแกรม
ทำไมต้องใช้ Unix Timestamp ในการเขียนโปรแกรม?
Unix timestamp เป็นสกุลเงินสากลของเวลาในซอฟต์แวร์ ทำให้การคำนวณวันที่เป็นเรื่องง่าย (เพียงบวกหรือลบวินาที) ขจัดความสับสนเรื่องเขตเวลา และซีเรียลไลซ์เป็น JSON ได้อย่างสะอาด ภาษาโปรแกรมทุกภาษามีฟังก์ชันที่ตรงไปตรงมาสำหรับการทำงานกับ timestamp แต่ API แตกต่างกันเล็กน้อย คู่มือนี้นำเสนอภาษาที่พบบ่อยที่สุดและแนวปฏิบัติที่ดีที่สุด
JavaScript (Browser และ Node.js)
JavaScript ใช้ มิลลิวินาที สำหรับออบเจ็กต์ Date ในขณะที่ระบบอื่นๆ ส่วนใหญ่ใช้วินาที นี่คือสาเหตุของบั๊กที่พบบ่อยที่สุด
การรับ Timestamp ปัจจุบัน
// มิลลิวินาทีนับตั้งแต่ epoch (JavaScript มาตรฐาน)
const nowMs = Date.now(); // 1785292800000
// วินาทีนับตั้งแต่ epoch (เพื่อความเข้ากันได้)
const nowSec = Math.floor(Date.now() / 1000); // 1785292800
// ตัวจับเวลาความละเอียดสูงของ Node.js (ไมโครวินาที)
const hrTime = process.hrtime.bigint();
การแปลง Timestamp เป็น Date
// จากวินาที (API และฐานข้อมูลส่วนใหญ่)
const timestamp = 1785292800;
const date = new Date(timestamp * 1000); // คูณด้วย 1000!
// จากมิลลิวินาที (รูปแบบดั้งเดิมของ JavaScript)
const dateFromMs = new Date(1785292800000);
// จัดรูปแบบผลลัพธ์
console.log(date.toISOString());
// ผลลัพธ์: 2026-07-19T00:00:00.000Z
console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// ผลลัพธ์: 7/18/2026, 8:00:00 PM
การแยกวิเคราะห์สตริงวันที่เป็น Timestamp
// ใช้ Date.parse() (คืนค่าเป็นมิลลิวินาที)
const ms = Date.parse("2026-07-19T00:00:00Z");
const sec = ms / 1000; // 1785292800
// ใช้ Date constructor
const ts = Math.floor(new Date("2026-07-19 UTC").getTime() / 1000);
คำเตือน: พฤติกรรมของ Date.parse() แตกต่างกันไปในแต่ละเบราว์เซอร์สำหรับสตริงวันที่ที่ไม่ได้มาตรฐาน การใช้รูปแบบ ISO 8601 พร้อมตัวระบุเขตเวลา (Z สำหรับ UTC) ปลอดภัยที่สุด
การทำงานกับเขตเวลาใน 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));
// ผลลัพธ์: 07/19/2026 09:00:00
สำหรับการทำงานกับเขตเวลาขั้นสูง แนะนำให้ใช้ Intl.DateTimeFormat API หรือไลบรารีเช่น date-fns-tz และ Luxon
Python
Python มีทั้งโมดูลระดับต่ำ (time) และระดับสูง (datetime) สำหรับการทำงานกับ timestamp
การรับ Timestamp ปัจจุบัน
import time
# วินาทีเป็น float (รวมมิลลิวินาทีเศษส่วน)
current = time.time()
# ตัวอย่าง: 1785292800.123456
# เป็นจำนวนเต็ม
current_int = int(time.time())
การแปลง Timestamp เป็น Datetime
from datetime import datetime
# UTC datetime (Python 3.x)
dt_utc = datetime.utcfromtimestamp(1785292800)
# Datetime ที่รับรู้เขตเวลา (Python 3.9+ พร้อม zoneinfo)
from zoneinfo import ZoneInfo
dt_tokyo = datetime.fromtimestamp(1785292800, tz=ZoneInfo("Asia/Tokyo"))
# สตริงที่จัดรูปแบบแล้ว
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))
# ผลลัพธ์: 2026-07-19 00:00:00
การแยกวิเคราะห์สตริงวันที่เป็น Timestamp
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 timestamp เป็น 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 ที่ง่ายที่สุดสำหรับการดำเนินการกับ timestamp
การรับ Timestamp ปัจจุบัน
<?php
$now = time(); // จำนวนเต็ม: 1785292800
$nowMicro = microtime(); // สตริง: "0.12345600 1785292800"
$nowFloat = microtime(true); // Float: 1785292800.1235
การแปลง Timestamp เป็น Date
<?php
echo date("Y-m-d H:i:s", 1785292800);
// ผลลัพธ์: 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
แพ็กเกจ time ของ Go ได้รับการออกแบบมาอย่างดีแต่ต้องการความเข้าใจที่ชัดเจนเกี่ยวกับชนิดข้อมูลที่เกี่ยวข้อง
การรับ Timestamp ปัจจุบัน
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)
}
การแปลง Timestamp เป็น Date
t := time.Unix(1785292800, 0)
fmt.Println(t.UTC())
// ผลลัพธ์: 2026-07-19 00:00:00 +0000 UTC
// จัดรูปแบบเป็นสตริง
fmt.Println(t.Format("2006-01-02 15:04:05"))
// ผลลัพธ์: 2026-07-19 00:00:00
// พร้อมเขตเวลา
loc, _ := time.LoadLocation("America/Chicago")
fmt.Println(t.In(loc))
Rust
use std::time::{SystemTime, UNIX_EPOCH};
// Timestamp ปัจจุบัน
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
println!("Seconds: {}", now.as_secs());
// Timestamp เป็น date
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 | แนะนำให้ใช้ชนิด timestamp ดั้งเดิม |
| MySQL / MariaDB | INT UNSIGNED (สำหรับวันที่ถึงปี 2106) หรือ BIGINT | หลีกเลี่ยงชนิด TIMESTAMP (ช่วงสิ้นสุดที่ปี 2038) |
| SQLite | INTEGER | SQLite ไม่มีชนิด timestamp ดั้งเดิม |
| MongoDB | ออบเจ็กต์ Date หรือ int64 | BSON Date ภายในเป็น timestamp 64 บิต |
ตัวอย่าง PostgreSQL
-- จัดเก็บเป็น timestamp ดั้งเดิม
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 timestamp
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
);
-- แทรก timestamp ปัจจุบัน
INSERT INTO logs (event_time, message) VALUES (UNIX_TIMESTAMP(), 'Server started');
-- คิวรีและแปลง
SELECT FROM_UNIXTIME(event_time) AS readable_time FROM logs;
ตารางเปรียบเทียบภาษา
| ภาษา | Timestamp ปัจจุบัน | Timestamp เป็น Date | Date เป็น Timestamp | ความละเอียด |
|----------|-------------------|-------------------|-------------------|------------|
| JavaScript | Date.now() | new Date(ts * 1000) | Date.parse(str) / 1000 | มิลลิวินาที |
| Python | time.time() | datetime.fromtimestamp(ts) | datetime.strptime(str).timestamp() | Float วินาที |
| 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 ของเราเป็นเพื่อนคู่ใจที่เชื่อถือได้สำหรับการตรวจสอบอย่างรวดเร็วและการดีบัก