Epoch Time: Nền Tảng Của Dấu Thời Gian Unix

Epoch Time chính xác là gì?

Nếu bạn đã từng làm việc với ngày tháng và thời gian trong lập trình, chắc hẳn bạn đã gặp Unix timestamps. Nhưng chúng thực sự là gì, và tại sao chúng ta lại sử dụng chúng?

Unix epoch time (còn gọi là Unix time, POSIX time, hoặc đơn giản là "epoch") biểu diễn một khoảnh khắc cụ thể trong thời gian dưới dạng số giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970, lúc nửa đêm UTC (Giờ Phối hợp Quốc tế). Khoảnh khắc cụ thể này được gọi là "Unix epoch" hoặc "epoch zero".

Ví dụ nhanh: Nếu Unix timestamp hiện tại là 1728773400, điều đó có nghĩa là chính xác 1.728.773.400 giây đã trôi qua kể từ nửa đêm ngày 1 tháng 1 năm 1970.

Tại sao lại là ngày 1 tháng 1 năm 1970?

Ngày này có vẻ tùy tiện, nhưng nó được chọn khi Unix đang được phát triển vào đầu những năm 1970 tại Bell Labs. Các nhà phát triển cần một điểm khởi đầu nhất quán cho hệ thống theo dõi thời gian của họ, và ngày 1 tháng 1 năm 1970 gần với thời điểm họ đang làm việc trên dự án. Nó đã trở thành tiêu chuẩn phổ quát kể từ đó.

Hiểu về định dạng

Unix timestamps có các định dạng khác nhau tùy thuộc vào độ chính xác cần thiết:

  • Giây (10 chữ số): Định dạng tiêu chuẩn, như 1728773400
  • Mili giây (13 chữ số): Để có độ chính xác cao hơn, như 1728773400000
  • Micro giây (16 chữ số): Để định thời gian cực kỳ chính xác, như 1728773400000000

Các khoảng thời gian phổ biến tính bằng giây

Hiểu các khoảng thời gian phổ biến này có thể giúp bạn làm việc với timestamps một cách trực quan hơn:

Khoảng thời gian Giây Cách tính nhanh
1 Giờ 3.600 60 × 60
1 Ngày 86.400 24 × 3.600
1 Tuần 604.800 7 × 86.400
1 Tháng (trung bình) 2.629.743 30,44 × 86.400
1 Năm (trung bình) 31.556.926 365,24 × 86.400

Vấn đề năm 2038 (Y2038)

Đây là điều quan trọng: nhiều hệ thống lưu trữ Unix timestamps dưới dạng số nguyên có dấu 32-bit. Điều này tạo ra một vấn đề tương tự như lỗi Y2K.

Một số nguyên có dấu 32-bit chỉ có thể đếm đến 2.147.483.647 giây. Một khi chúng ta đạt đến ngày 19 tháng 1 năm 2038, lúc 03:14:07 UTC, bộ đếm này sẽ tràn số và quay về một số âm, có thể gây ra lỗi hệ thống và bugs.

Quan trọng: Các hệ thống hiện đại đang chuyển sang timestamps 64-bit, sẽ không bị tràn số trong 292 tỷ năm nữa. Hãy đảm bảo ứng dụng của bạn sử dụng số nguyên 64-bit để lưu trữ timestamp!

Lấy Epoch Time hiện tại

Mỗi ngôn ngữ lập trình có cách riêng để lấy Unix timestamp hiện tại. Dưới đây là các phương pháp phổ biến nhất:

Phát triển Web

JavaScript

// Lấy timestamp tính bằng mili giây, chia cho 1000 để có giây
const timestamp = Math.floor(Date.now() / 1000);

// Phương pháp thay thế
const timestamp = Math.floor(new Date().getTime() / 1000);

PHP

// Đơn giản và dễ hiểu
$timestamp = time();

// Sử dụng DateTime (linh hoạt hơn)
$timestamp = (new DateTime())->getTimestamp();

Ngôn ngữ Backend

Python

import time

# Lấy timestamp hiện tại
timestamp = int(time.time())

# Sử dụng module datetime
from datetime import datetime
timestamp = int(datetime.now().timestamp())

Java

// Trả về mili giây, chia cho 1000 để có giây
long timestamp = System.currentTimeMillis() / 1000;

// Sử dụng Instant (Java 8+)
long timestamp = Instant.now().getEpochSecond();

C#

// .NET Framework 4.6+ / .NET Core
long timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();

// Các phiên bản cũ hơn
var epoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;

Ruby

# Lấy timestamp hiện tại
timestamp = Time.now.to_i

# Cách khác
timestamp = Time.new.to_i

Go

import "time"

// Lấy Unix timestamp hiện tại
timestamp := time.Now().Unix()

// Cho mili giây
milliseconds := time.Now().UnixMilli()

Truy vấn cơ sở dữ liệu

MySQL

-- Lấy timestamp hiện tại
SELECT UNIX_TIMESTAMP();

-- Lấy timestamp từ ngày cụ thể
SELECT UNIX_TIMESTAMP('2025-10-12 14:30:00');

PostgreSQL

-- Lấy timestamp hiện tại
SELECT EXTRACT(EPOCH FROM NOW());

-- Từ ngày cụ thể
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2025-10-12 14:30:00');

SQLite

-- Lấy timestamp hiện tại
SELECT STRFTIME('%s', 'now');

-- Từ ngày cụ thể
SELECT STRFTIME('%s', '2025-10-12 14:30:00');

Dòng lệnh

Unix/Linux Shell

# Lấy timestamp hiện tại
date +%s

# Chuyển đổi ngày cụ thể thành timestamp
date +%s -d "2025-10-12 14:30:00"

# Cho giờ UTC/GMT, sử dụng -ud thay vì -d
date +%s -ud "2025-10-12 14:30:00"

PowerShell

# Lấy timestamp hiện tại
[int][double]::Parse((Get-Date (Get-Date).ToUniversalTime() -UFormat %s))

Chuyển đổi TỪ Epoch sang ngày tháng dễ đọc

Một khi bạn có Unix timestamp, bạn thường cần chuyển đổi nó trở lại định dạng ngày dễ đọc:

JavaScript

// Chuyển đổi timestamp thành đối tượng Date
const date = new Date(timestamp * 1000); // Nhân với 1000 để có mili giây

// Định dạng nó
console.log(date.toLocaleString()); // Định dạng địa phương
console.log(date.toISOString());    // Định dạng ISO 8601

PHP

// Định dạng timestamp
$date = date('Y-m-d H:i:s', $timestamp);

// Định dạng RFC 2822
$date = date('r', $timestamp);

// Sử dụng DateTime
$date = (new DateTime())->setTimestamp($timestamp)->format('Y-m-d H:i:s');

Python

from datetime import datetime

# Chuyển đổi thành đối tượng datetime
dt = datetime.fromtimestamp(timestamp)

# Định dạng nó
formatted = dt.strftime('%Y-%m-%d %H:%M:%S')

# Cho UTC
dt_utc = datetime.utcfromtimestamp(timestamp)

MySQL

-- Chuyển đổi timestamp thành datetime
SELECT FROM_UNIXTIME(1728773400);

-- Với định dạng tùy chỉnh
SELECT FROM_UNIXTIME(1728773400, '%Y-%m-%d %H:%i:%s');

Chuyển đổi TỪ ngày tháng dễ đọc sang Epoch

Thao tác ngược lại cũng quan trọng không kém:

JavaScript

// Phân tích chuỗi ngày thành timestamp
const timestamp = Math.floor(new Date('2025-10-12 14:30:00').getTime() / 1000);

// Sử dụng Date.parse()
const timestamp = Math.floor(Date.parse('October 12, 2025') / 1000);

PHP

// Phân tích hầu hết các văn bản ngày tiếng Anh
$timestamp = strtotime('15 November 2025');
$timestamp = strtotime('next Monday');
$timestamp = strtotime('+1 week');

// Sử dụng DateTime
$timestamp = (new DateTime('2025-10-12 14:30:00'))->getTimestamp();

Python

from datetime import datetime
import time

# Phân tích chuỗi ngày
dt = datetime.strptime('2025-10-12 14:30:00', '%Y-%m-%d %H:%M:%S')
timestamp = int(dt.timestamp())

# Cho UTC
import calendar
timestamp = calendar.timegm(time.strptime('2025-10-12 14:30:00', '%Y-%m-%d %H:%M:%S'))

Các phương pháp hay nhất

Khi làm việc với Unix timestamps trong ứng dụng của bạn:

  • Luôn sử dụng số nguyên 64-bit để tránh vấn đề Y2038
  • Lưu trữ timestamps theo UTC trong cơ sở dữ liệu của bạn, chỉ chuyển đổi sang giờ địa phương khi hiển thị
  • Nhất quán với độ chính xác của bạn (giây so với mili giây) trong suốt ứng dụng
  • Ghi chú định dạng của bạn – làm rõ bạn đang sử dụng giây hay mili giây
  • Cân nhắc các thư viện nhận biết múi giờ cho các thao tác ngày/giờ phức tạp
  • Không bao giờ lưu trữ giờ địa phương dưới dạng timestamp mà không có thông tin múi giờ

Kết luận

Unix timestamps là một khái niệm cơ bản trong lập trình mà mọi developer nên hiểu. Chúng cung cấp một cách đơn giản, phổ quát để biểu diễn thời gian hoạt động trên tất cả các hệ thống và ngôn ngữ lập trình.

Cho dù bạn đang xây dựng một ứng dụng web, làm việc với cơ sở dữ liệu, hay chỉ cần lên lịch các tác vụ, hiểu epoch time sẽ giúp cuộc sống của bạn dễ dàng hơn nhiều. Sử dụng công cụ Unix Timestamp Converter của chúng tôi để nhanh chóng chuyển đổi giữa timestamps và ngày tháng dễ đọc!

Thử ngay: Hãy truy cập công cụ chuyển đổi của chúng tôi để thực hành làm việc với Unix timestamps trong thời gian thực!