🕐
← Quay lại hướng dẫn

Dấu thời gian Unix là gì? Hướng dẫn toàn diện

· Thẻ: unix-timestamp, epoch, linux-time, 2038-problem, utc, time-conversion

Dấu thời gian Unix là gì?

Dấu thời gian Unix (còn gọi là thời gian POSIX hoặc thời gian Epoch) là một hệ thống theo dõi thời gian bằng cách đếm số giây đã trôi qua kể từ epoch Unix — 00:00:00 UTC ngày 1 tháng 1 năm 1970 — không bao gồm giây nhuận.

Không giống như ngày tháng mà con người có thể đọc được nhưng thay đổi theo múi giờ ("19 tháng 7 năm 2026, 3:30 CH EST"), dấu thời gian Unix là một số nguyên duy nhất biểu thị cùng một thời điểm ở mọi nơi trên Trái Đất. Ví dụ: dấu thời gian 1785292800 tương ứng với một khoảnh khắc cụ thể bất kể bạn đang ở New York, London hay Tokyo.

Dấu thời gian Unix là nền tảng của việc xử lý thời gian trong máy tính hiện đại. Hệ điều hành, ngôn ngữ lập trình, cơ sở dữ liệu và hệ thống tệp đều dựa trên biểu diễn số nguyên đơn giản này ở bên dưới.

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

Việc chọn ngày 1 tháng 1 năm 1970 làm "epoch" (điểm bắt đầu) không phải là tùy ý. Một số cân nhắc thực tế đã dẫn đến quyết định này:

  • Phát triển Unix ban đầu: Hệ điều hành Unix được phát triển tại Bell Labs vào cuối những năm 1960 và đầu những năm 1970. Đến khi hệ thống thời gian được chuẩn hóa vào đầu những năm 1970, ngày 1 tháng 1 năm 1970 là một điểm tham chiếu gần đây và rõ ràng.
  • Tính đơn giản: Thời gian trên các hệ thống Unix ban đầu được lưu trữ dưới dạng số nguyên có dấu 32 bit đếm giây. Sử dụng một ngày gần đây sẽ tối đa hóa phạm vi có thể biểu diễn trong tương lai.
  • Tiền lệ: Epoch đã được chính thức hóa trong tiêu chuẩn POSIX đầu tiên, biến nó thành tham chiếu chung cho các hệ thống dẫn xuất từ Unix.

Các hệ thống giống Unix trước đây đã từng sử dụng các ngày epoch khác nhau, nhưng epoch năm 1970 đã thắng thế và trở thành tiêu chuẩn cho tất cả các hệ thống tuân thủ POSIX kể từ đó.

Cách giá trị dấu thời gian hoạt động

Ý tưởng cốt lõi rất đơn giản:

  • Dấu thời gian 0 có nghĩa chính xác là ngày 1 tháng 1 năm 1970, 00:00:00 UTC
  • Dấu thời gian 86400 (60 × 60 × 24) có nghĩa là ngày 2 tháng 1 năm 1970, 00:00:00 UTC
  • Dấu thời gian -3600 có nghĩa là ngày 31 tháng 12 năm 1969, 23:00:00 UTC (dấu thời gian âm biểu thị các ngày trước epoch)

Công thức rất đơn giản:

timestamp = số giây kể từ 1970-01-01 00:00:00 UTC

Dấu thời gian mili giây

Nhiều hệ thống hiện đại, đặc biệt là JavaScript và các API web, sử dụng mili giây thay vì giây. Dấu thời gian mili giây đơn giản là giá trị dựa trên giây nhân với 1000:

  • Date.now() của JavaScript trả về mili giây
  • time.time() của Python trả về giây dưới dạng số thực với phần mili giây thập phân

Luôn xác minh độ phân giải mà một hệ thống sử dụng trước khi chuyển đổi, vì việc nhầm lẫn chúng có thể tạo ra các ngày lệch đến hàng thập kỷ.

Vấn đề năm 2038

Vấn đề năm 2038 (còn gọi là "Lỗi Thiên niên kỷ Unix" hay "Y2K38") là một vấn đề biểu diễn thời gian sẽ ảnh hưởng đến các hệ thống lưu trữ dấu thời gian dưới dạng số nguyên có dấu 32 bit.

Một số nguyên có dấu 32 bit có thể chứa các giá trị từ khoảng -2.1 tỷ đến +2.1 tỷ. Dấu thời gian Unix tối đa có thể biểu diễn là 2147483647, tương ứng với:

  • Ngày 19 tháng 1 năm 2038, 03:14:07 UTC

Một giây sau đó, giá trị sẽ tràn thành -2147483648, biểu thị ngày 13 tháng 12 năm 1901 — khiến các hệ thống hiểu thời gian hiện tại là một ngày từ đầu thế kỷ 20.

Những hệ thống nào bị ảnh hưởng?

  • Thiết bị nhúng và phần cứng IoT với bộ xử lý 32 bit
  • Các nhân Linux nhúng cũ hơn
  • Cơ sở dữ liệu cũ sử dụng cột thời gian số nguyên 32 bit
  • Hệ thống tệp và định dạng nhị phân lưu trữ thời gian dưới dạng số nguyên 32 bit

Cách khắc phục

Các hệ thống hiện đại hầu hết đã chuyển sang số nguyên 64 bit để lưu trữ thời gian. Một số nguyên có dấu 64 bit có thể biểu diễn thời gian lên đến khoảng 292 tỷ năm trong tương lai — thực tế là vô hạn cho mọi mục đích thực tiễn.

  • Hầu hết các bản phân phối Linux hiện đại trên phần cứng 64 bit đã an toàn
  • Nhân Linux đã sử dụng time_t 64 bit trên các hệ thống 64 bit trong nhiều năm
  • Nhân 5.6+ đã giới thiệu hỗ trợ time_t 64 bit cho các kiến trúc 32 bit
  • Các ngôn ngữ lập trình như Python, Go và Java sử dụng số nguyên 64 bit bên trong

Nếu bạn duy trì các hệ thống nhúng hoặc phần mềm cũ, việc kiểm tra kích thước time_t của bạn là một bài tập đáng làm ngay hôm nay.

UTC và mối quan hệ với dấu thời gian Unix

Dấu thời gian Unix về bản chất là độc lập với múi giờ — chúng luôn tham chiếu đến UTC.

UTC là gì?

Giờ Phối hợp Quốc tế (UTC) là tiêu chuẩn thời gian chính mà thế giới sử dụng để điều chỉnh đồng hồ và thời gian. Nó thay thế Giờ Trung bình Greenwich (GMT) làm tiêu chuẩn quốc tế và được duy trì bởi đồng hồ nguyên tử.

Tại sao UTC quan trọng đối với dấu thời gian Unix

  • Dấu thời gian Unix được định nghĩa theo UTC, vì vậy một dấu thời gian biểu thị cùng một thời điểm trên toàn cầu
  • Việc chuyển đổi dấu thời gian Unix sang giờ địa phương hoàn toàn là vấn đề ở lớp hiển thị
  • Không có thông tin múi giờ nào được lưu trữ trong chính dấu thời gian, điều này giữ cho hệ thống đơn giản và dễ di chuyển

Thiết kế này có nghĩa là bạn có thể chia sẻ một dấu thời gian Unix với bất kỳ ai trên thế giới và cả hai bên đều có thể chuyển đổi nó sang giờ địa phương của riêng mình mà không có sự mơ hồ.

Giây nhuận: Ngoại lệ hiếm gặp

Dấu thời gian Unix về mặt lý thuyết đếm giây kể từ epoch, nhưng chúng bỏ qua giây nhuận. Một ngày có thêm giây nhuận vẫn có chính xác 86400 giây trong thời gian Unix. Điều này có nghĩa là trong một giây nhuận, dấu thời gian Unix không tăng lên và giây nhuận thực sự biến mất khỏi bộ đếm.

Sự đơn giản hóa này giữ cho hệ thống thực tế nhưng có nghĩa là dấu thời gian Unix hơi lệch so với thời gian nguyên tử. Sự khác biệt đủ nhỏ để hiếm khi quan trọng đối với các ứng dụng hàng ngày.

Các phạm vi dấu thời gian phổ biến

| Dấu thời gian | Ngày tháng con người đọc được | Ý nghĩa | |-----------|---------------------|--------------| | 0 | 1970-01-01 00:00:00 UTC | Epoch Unix | | 86400 | 1970-01-02 00:00:00 UTC | Một ngày sau epoch | | 946684800 | 2000-01-01 00:00:00 UTC | Năm 2000 | | 1234567890 | 2009-02-13 23:31:30 UTC | Một mẫu đáng nhớ | | 1785292800 | 2026-07-19 00:00:00 UTC | Epoch của ngày hôm nay | | 2147483647 | 2038-01-19 03:14:07 UTC | Tối đa 32 bit |

Tóm tắt

Dấu thời gian Unix là một cách thanh lịch, dễ di chuyển để biểu diễn thời gian dưới dạng một số nguyên duy nhất. Thiết kế của nó — đếm giây từ ngày 1 tháng 1 năm 1970 UTC — khiến nó trở thành tiêu chuẩn thời gian phổ quát trên các hệ điều hành, cơ sở dữ liệu và ngôn ngữ lập trình. Trong khi vấn đề năm 2038 đang rình rập các hệ thống cũ, quá trình chuyển đổi đang diễn ra sang thời gian 64 bit đảm bảo rằng dấu thời gian Unix sẽ vẫn là nền tảng của việc đo thời gian trong máy tính cho nhiều thế hệ tiếp theo.

Sẵn sàng làm việc với dấu thời gian Unix? Sử dụng Trình chuyển đổi dấu thời gian Unix của chúng tôi để chuyển đổi ngay lập tức giữa dấu thời gian và ngày tháng con người đọc được.