Làm việc với Unix Timestamp trong các ngôn ngữ lập trình
Tại sao sử dụng Unix Timestamp trong lập trình?
Unix timestamp là đơn vị tiền tệ chung của thời gian trong phần mềm. Chúng giúp các phép tính số học về ngày tháng trở nên đơn giản (chỉ cần cộng hoặc trừ giây), loại bỏ sự nhầm lẫn về múi giờ và tuần tự hóa gọn gàng sang JSON. Mọi ngôn ngữ lập trình đều cung cấp các hàm đơn giản để làm việc với chúng, nhưng API có sự khác biệt nhỏ. Hướng dẫn này bao gồm các ngôn ngữ phổ biến nhất và các phương pháp tốt nhất của chúng.
JavaScript (Browser và Node.js)
JavaScript sử dụng mili giây cho đối tượng Date, trong khi hầu hết các hệ thống khác sử dụng giây. Đây là nguồn gốc phổ biến nhất của lỗi.
Lấy Timestamp hiện tại
// Mili giây kể từ epoch (JavaScript tiêu chuẩn)
const nowMs = Date.now(); // 1785292800000
// Giây kể từ epoch (để tương thích)
const nowSec = Math.floor(Date.now() / 1000); // 1785292800
// Bộ đếm thời gian độ phân giải cao của Node.js (micro giây)
const hrTime = process.hrtime.bigint();
Chuyển đổi Timestamp sang Ngày giờ
// Từ giây (hầu hết các API và cơ sở dữ liệu)
const timestamp = 1785292800;
const date = new Date(timestamp * 1000); // Nhân với 1000!
// Từ mili giây (JavaScript gốc)
const dateFromMs = new Date(1785292800000);
// Định dạng kết quả
console.log(date.toISOString());
// Kết quả: 2026-07-19T00:00:00.000Z
console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" }));
// Kết quả: 7/18/2026, 8:00:00 PM
Phân tích Chuỗi ngày giờ sang Timestamp
// Sử dụng Date.parse() (trả về mili giây)
const ms = Date.parse("2026-07-19T00:00:00Z");
const sec = ms / 1000; // 1785292800
// Sử dụng hàm tạo Date
const ts = Math.floor(new Date("2026-07-19 UTC").getTime() / 1000);
Cảnh báo: Hành vi của Date.parse() khác nhau giữa các trình duyệt đối với chuỗi ngày không chuẩn. Sử dụng định dạng ISO 8601 với chỉ định múi giờ (Z cho UTC) là an toàn nhất.
Làm việc với Múi giờ trong JavaScript
// Định dạng theo múi giờ cụ thể
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));
// Kết quả: 07/19/2026 09:00:00
Đối với các thao tác múi giờ nâng cao, API Intl.DateTimeFormat hoặc các thư viện như date-fns-tz và Luxon được khuyến nghị.
Python
Python cung cấp cả mô-đun cấp thấp (time) và cấp cao (datetime) để làm việc với timestamp.
Lấy Timestamp hiện tại
import time
# Giây dưới dạng số thực (bao gồm mili giây phân số)
current = time.time()
# Ví dụ: 1785292800.123456
# Dưới dạng số nguyên
current_int = int(time.time())
Chuyển đổi Timestamp sang Datetime
from datetime import datetime
# Datetime UTC (Python 3.x)
dt_utc = datetime.utcfromtimestamp(1785292800)
# Datetime có nhận biết múi giờ (Python 3.9+ với zoneinfo)
from zoneinfo import ZoneInfo
dt_tokyo = datetime.fromtimestamp(1785292800, tz=ZoneInfo("Asia/Tokyo"))
# Chuỗi đã định dạng
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))
# Kết quả: 2026-07-19 00:00:00
Phân tích Chuỗi ngày giờ sang Timestamp
import time
from datetime import datetime
# Từ chuỗi ngày giờ
dt = datetime.strptime("2026-07-19 00:00:00", "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(dt.timetuple()) # Coi là giờ địa phương
# Đối với đầu vào UTC
from datetime import timezone
timestamp_utc = dt.replace(tzinfo=timezone.utc).timestamp()
Làm việc với Pandas (Phân tích dữ liệu)
import pandas as pd
# Chuyển đổi cột Unix timestamp sang datetime
df["timestamp"] = pd.to_datetime(df["unix_seconds"], unit="s")
# Chuyển đổi sang các đơn vị khác
df["datetime_ms"] = pd.to_datetime(df["unix_milliseconds"], unit="ms")
# Đặt múi giờ
df["timestamp_ny"] = df["timestamp"].dt.tz_localize("UTC").dt.tz_convert("America/New_York")
PHP
PHP có API đơn giản nhất cho các thao tác timestamp.
Lấy Timestamp hiện tại
<?php
$now = time(); // Số nguyên: 1785292800
$nowMicro = microtime(); // Chuỗi: "0.12345600 1785292800"
$nowFloat = microtime(true); // Số thực: 1785292800.1235
Chuyển đổi Timestamp sang Ngày giờ
<?php
echo date("Y-m-d H:i:s", 1785292800);
// Kết quả: 2026-07-19 00:00:00
// Với múi giờ
$tz = new DateTimeZone("Europe/London");
$dt = new DateTime("@1785292800");
$dt->setTimezone($tz);
echo $dt->format("Y-m-d H:i:s");
Go
Gói time của Go được thiết kế tốt nhưng yêu cầu hiểu rõ về các kiểu liên quan.
Lấy Timestamp hiện tại
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
sec := now.Unix() // int64 giây
milli := now.UnixMilli() // int64 mili giây
nano := now.UnixNano() // int64 nano giây
fmt.Printf("Seconds: %d\n", sec)
}
Chuyển đổi Timestamp sang Ngày giờ
t := time.Unix(1785292800, 0)
fmt.Println(t.UTC())
// Kết quả: 2026-07-19 00:00:00 +0000 UTC
// Định dạng thành chuỗi
fmt.Println(t.Format("2006-01-02 15:04:05"))
// Kết quả: 2026-07-19 00:00:00
// Với múi giờ
loc, _ := time.LoadLocation("America/Chicago")
fmt.Println(t.In(loc))
Rust
use std::time::{SystemTime, UNIX_EPOCH};
// Timestamp hiện tại
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
println!("Seconds: {}", now.as_secs());
// Timestamp sang ngày giờ
let dt = chrono::NaiveDateTime::from_timestamp_opt(1785292800, 0).unwrap();
println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));
Lưu trữ Cơ sở dữ liệu: Các phương pháp tốt nhất
Chọn Kiểu cột phù hợp
| Cơ sở dữ liệu | Kiểu được khuyến nghị | Ghi chú |
|---------------|----------------------|---------|
| PostgreSQL | TIMESTAMP WITH TIME ZONE hoặc BIGINT | Kiểu timestamp gốc được ưu tiên |
| MySQL / MariaDB | INT UNSIGNED (cho ngày đến 2106) hoặc BIGINT | Tránh kiểu TIMESTAMP (phạm vi kết thúc vào 2038) |
| SQLite | INTEGER | SQLite không có kiểu timestamp gốc |
| MongoDB | Đối tượng Date hoặc int64 | BSON Date nội bộ là timestamp 64-bit |
Ví dụ PostgreSQL
-- Lưu trữ dưới dạng timestamp gốc
CREATE TABLE events (
id SERIAL PRIMARY KEY,
occurred_at TIMESTAMP WITH TIME ZONE NOT NULL,
payload JSONB
);
-- Chèn với thời gian hiện tại
INSERT INTO events (occurred_at) VALUES (NOW());
-- Truy vấn dưới dạng Unix timestamp
SELECT EXTRACT(EPOCH FROM occurred_at) AS unix_ts FROM events;
Ví dụ MySQL
-- Sử dụng BIGINT để lưu trữ an toàn cho tương lai
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time BIGINT NOT NULL,
message TEXT
);
-- Chèn timestamp hiện tại
INSERT INTO logs (event_time, message) VALUES (UNIX_TIMESTAMP(), 'Server started');
-- Truy vấn và chuyển đổi
SELECT FROM_UNIXTIME(event_time) AS readable_time FROM logs;
Bảng so sánh Ngôn ngữ
| Ngôn ngữ | Timestamp hiện tại | Timestamp sang Ngày | Ngày sang Timestamp | Độ phân giải |
|----------|--------------------|---------------------|---------------------|-------------|
| JavaScript | Date.now() | new Date(ts * 1000) | Date.parse(str) / 1000 | Mili giây |
| Python | time.time() | datetime.fromtimestamp(ts) | datetime.strptime(str).timestamp() | Giây số thực |
| PHP | time() | date("Y-m-d", ts) | strtotime(str) | Giây |
| Go | time.Now().Unix() | time.Unix(ts, 0) | time.Parse(layout, str).Unix() | Giây |
| Rust | SystemTime::now() | NaiveDateTime::from_timestamp_opt() | — | Khác nhau |
Dù bạn sử dụng ngôn ngữ nào, Unix Timestamp Converter của chúng tôi là công cụ đồng hành đáng tin cậy để kiểm tra nhanh và gỡ lỗi.