Hướng dẫn

Hướng dẫn chuyển đổi Timestamp Unix

Timestamp Unix là một hệ thống theo dõi thời gian đơn giản đếm số giây kể từ 00:00:00 UTC ngày 1 tháng 1 năm 1970. Hiểu timestamp là cần thiết cho lập trình, API, và bất kỳ ứng dụng nào xử lý ngày và giờ.

Timestamp Unix là gì?

Timestamp Unix, còn được gọi là thời gian Epoch hoặc thời gian POSIX, là một hệ thống mô tả một điểm trong thời gian. Nó được định nghĩa là số giây đã trôi qua kể từ Unix Epoch: 00:00:00 Coordinated Universal Time (UTC), thứ Năm, ngày 1 tháng 1 năm 1970, không bao gồm giây nhuận. Ví dụ, timestamp Unix 1609459200 đại diện cho 00:00:00 UTC ngày 1 tháng 1 năm 2021. Timestamp 0 đại diện cho chính Unix Epoch. Timestamp âm đại diện cho ngày trước Epoch—ví dụ, -86400 là 00:00:00 UTC ngày 31 tháng 12 năm 1969. Sự đơn giản là sức mạnh chính của timestamp Unix. Thay vì lưu trữ các ngày phức tạp với năm, tháng, ngày, giờ, phút và giây, bạn chỉ cần một số duy nhất. Điều này làm cho tính toán trở nên đơn giản—sự khác biệt giữa hai timestamp là số giây giữa chúng. So sánh cũng đơn giản: timestamp lớn hơn có nghĩa là thời gian sau này. Timestamp Unix là độc lập với múi giờ. Giá trị 1609459200 đại diện cho cùng một khoảnh khắc cho mọi người trên toàn thế giới, bất kể múi giờ địa phương của họ. Khi chuyển đổi sang ngày/giờ có thể đọc được, bạn áp dụng múi giờ tại thời điểm đó. Điều này làm cho timestamp lý tưởng cho hệ thống phân tán và ứng dụng toàn cầu. Hầu hết các ngôn ngữ lập trình và cơ sở dữ liệu hỗ trợ timestamp Unix một cách gốc. JavaScript sử dụng mili giây kể từ Epoch thay vì giây, vì vậy timestamp JavaScript thường dài hơn (13 chữ số so với 10 chữ số cho giây). Các ngôn ngữ khác như Python, PHP, Java, và C thường sử dụng giây. Luôn làm rõ liệu timestamp của bạn ở giây hay mili giây. Vấn đề năm 2038 là một giới hạn đã biết. Trên các hệ thống 32-bit, timestamp Unix được lưu trữ như số nguyên có dấu 32-bit, giới hạn ở 2,147,483,647. Giá trị tối đa này tương ứng với 03:14:07 UTC ngày 19 tháng 1 năm 2038. Sau đó, giá trị tràn sang số âm, gây ra lỗi. Hệ thống 64-bit không có vấn đề này—chúng có thể biểu diễn ngày hơn 292 tỷ năm vào tương lai.

Chuyển đổi Timestamp

Chuyển đổi giữa timestamp Unix và ngày/giờ có thể đọc được là một nhiệm vụ phổ biến trong lập trình. Hướng về phía trước—từ timestamp đến ngày—thường đơn giản hơn. Hầu hết các ngôn ngữ cung cấp các hàm tích hợp lấy timestamp và trả về một đối tượng ngày hoặc chuỗi được định dạng. Trong JavaScript: new Date(1609459200 * 1000) tạo một đối tượng Date. Nhớ nhân với 1000 vì JavaScript dự kiến mili giây. Trong Python: datetime.fromtimestamp(1609459200) trả về một đối tượng datetime. Trong PHP: date('Y-m-d H:i:s', 1609459200) định dạng timestamp như một chuỗi có thể đọc được. Chuyển đổi ngược—từ ngày đến timestamp—yêu cầu phân tích cú pháp ngày và trích xuất timestamp. JavaScript: new Date('2021-01-01').getTime() / 1000 trả về timestamp trong giây. Python: datetime(2021, 1, 1).timestamp() trả về timestamp. PHP: strtotime('2021-01-01') phân tích cú pháp chuỗi ngày thành timestamp. Xử lý múi giờ đúng cách là rất quan trọng. Timestamp Unix luôn ở UTC, nhưng ngày/giờ người dùng thường ở múi giờ địa phương. Khi chuyển đổi từ ngày người dùng sang timestamp, hãy làm rõ múi giờ. "2021-01-01 00:00:00" là mơ hồ—nó có nghĩa là nửa đêm ở múi giờ nào? Luôn chỉ định: "2021-01-01T00:00:00Z" (UTC) hoặc "2021-01-01T00:00:00-05:00" (EST). Định dạng ISO 8601 được khuyến nghị cho ngày/giờ. Định dạng 2021-01-01T00:00:00Z không mơ hồ, có thể phân tích cú pháp máy móc và có thể sắp xếp. Chữ Z chỉ ra UTC. Đối với múi giờ khác, sử dụng offset: 2021-01-01T00:00:00+02:00 cho UTC+2. Hầu hết các ngôn ngữ phân tích cú pháp ISO 8601 một cách gốc. Giây nhuận làm phức tạp hơn timestamp. Định nghĩa chính thức của timestamp Unix không bao gồm giây nhuận—chúng được "nhòe" trên phút xung quanh. Trong thực tế, hầu hết các hệ thống bỏ qua giây nhuận cho timestamp, nhưng cẩn thận với tính toán thời gian chính xác xung quanh các sự kiện giây nhuận. Độ chính xác quan trọng cho một số ứng dụng. Timestamp giây đủ cho hầu hết các trường hợp sử dụng (nhật ký, timestamp tạo, v.v.). Timestamp mili giây (JavaScript tiêu chuẩn) cung cấp độ chính xác mili giây. Một số hệ thống sử dụng timestamp micro giây (Python's time.time() có thể trả về số thực với phần phân số) hoặc nano giây cho tính toán hiệu suất và thời gian chính xác.

Thực hành tốt nhất

Luôn lưu trữ ngày/giờ như timestamp hoặc UTC trong cơ sở dữ liệu. Không bao giờ lưu trữ thời gian địa phương mà không có thông tin múi giờ—bạn sẽ không thể giải thích chính xác chúng sau này. Timestamp làm cho truy vấn, sắp xếp và so sánh đơn giản. Chuyển đổi sang múi giờ địa phương chỉ cho hiển thị, không bao giờ cho lưu trữ. Sử dụng kiểu dữ liệu phù hợp. PostgreSQL có TIMESTAMP WITH TIME ZONE (timestamptz) lưu trữ thời gian ở UTC và xử lý chuyển đổi múi giờ tự động. MySQL có TIMESTAMP (UTC) và DATETIME (múi giờ không được nhận thức). Chọn loại dựa trên nhu cầu của bạn, nhưng nhận thức múi giờ thường an toàn hơn. Khi làm việc với các API, tuân thủ các quy ước của họ. Một số API trả về timestamp trong giây, một số trong mili giây. Một số trả về chuỗi ISO 8601 thay vì số. Đọc tài liệu cẩn thận và xử lý từng định dạng một cách phù hợp. Khi thiết kế API của riêng bạn, tài liệu hóa định dạng timestamp của bạn rõ ràng. Xác thực timestamp từ đầu vào người dùng. Người dùng có thể nhập ngày không hợp lệ hoặc timestamp ngoài phạm vi hợp lý. Kiểm tra timestamp không quá xa trong quá khứ hoặc tương lai cho ứng dụng của bạn. Ví dụ, ngày sinh không nên trong tương lai, và ngày hết hạn không nên cách đây 100 năm. Cẩn thận với chuyển đổi múi giờ xung quanh thay đổi DST (Daylight Saving Time). Khi người dùng ở múi giờ có DST, cùng thời gian địa phương có thể ánh xạ đến các timestamp khác nhau trước và sau khi chuyển đổi DST. Sử dụng các thư viện múi giờ thích hợp (moment-timezone, pytz, Joda-Time) xử lý các trường hợp biên này chính xác. Đối với lập lịch sự kiện tương lai, xem xét lưu trữ cả timestamp và múi giờ dự định. Nếu một sự kiện được lên lịch cho "ngày 1 tháng 6 năm 2025 10:00 AM ở New York", lưu trữ cả timestamp UTC và múi giờ "America/New_York". Nếu quy tắc múi giờ thay đổi trước sự kiện, bạn có thể tính toán lại timestamp đúng cách. Hiển thị thời gian trong múi giờ của người dùng. Phát hiện múi giờ của người dùng từ cài đặt trình duyệt (JavaScript: Intl.DateTimeFormat().resolvedOptions().timeZone) hoặc cho phép người dùng thiết lập nó trong sở thích tài khoản. Chuyển đổi timestamp sang múi giờ địa phương của họ cho hiển thị, nhưng lưu trữ ở UTC trong nội bộ. Đối với ứng dụng thời gian thực, đồng bộ hóa đồng hồ máy chủ. Timestamp chỉ có ý nghĩa nếu đồng hồ chính xác. Sử dụng NTP (Network Time Protocol) để giữ đồng hồ máy chủ đồng bộ. Trôi đồng hồ có thể gây ra lỗi tinh vi trong hệ thống phân tán nơi thứ tự sự kiện quan trọng. Kiểm tra xử lý timestamp của bạn với các trường hợp biên: Unix Epoch (0), timestamp âm (trước 1970), vấn đề năm 2038, ngày chuyển đổi DST, giây nhuận (nếu hệ thống của bạn xử lý chúng), và múi giờ khác nhau. Việc kiểm tra kỹ lưỡng ngăn chặn lỗi liên quan đến thời gian trong sản xuất.

Thử công cụ

Chuyển Đổi Timestamp

Chuyển Đổi Timestamp

Tìm hiểu thêm

Câu hỏi thường gặp

Chuyển Đổi Timestamp

Câu hỏi thường gặp