Thời gian Unix trong một đoạn văn
Thời gian Unix đếm số giây đã trôi qua kể từ 00:00:00 UTC ngày 1 tháng 1 năm 1970, thời điểm được gọi là epoch. Nó hoàn toàn bỏ qua múi giờ và giờ mùa hè: tại bất kỳ khoảnh khắc nào, thời gian Unix là cùng một con số ở mọi nơi trên Trái Đất. Điều đó khiến nó trở thành định dạng tự nhiên để lưu và so sánh các thời điểm trong cơ sở dữ liệu, tệp log, các claim exp và iat của JWT, thời gian sửa đổi tệp, phản hồi API và các bộ lập lịch kiểu cron. Điểm vướng là 1700000000 chẳng có nghĩa gì với con người, và đó là việc của công cụ chuyển đổi này. Nhân tiện, con số đó là 14 tháng 11 năm 2023, 22:13:20 UTC.
Giây, mili giây và những con số dài hơn
Mỗi hệ thống đếm theo một đơn vị khác nhau:
- Giây, 10 chữ số với các ngày hiện tại: công cụ Unix và Linux,
time()của PHP,time.time()của Python (kèm phần thập phân), hầu hết cơ sở dữ liệu SQL, JWT. - Mili giây, 13 chữ số:
Date.now()của JavaScript,System.currentTimeMillis()của Java, nhiều API JSON và sự kiện phân tích. - Micro giây, 16 chữ số, và nano giây, 19 chữ số: một số cơ sở dữ liệu, Go, công cụ truy vết độ phân giải cao.
Công cụ xác định đơn vị theo độ lớn. Mọi số nguyên có giá trị tuyệt đối dưới 100.000.000.000 được đọc là giây, đến 100.000.000.000.000 (14 chữ số) là mili giây, dưới 10^17 là micro giây và lớn hơn nữa là nano giây. Các ngưỡng này đúng với mọi trường hợp thực tế: nếu tính bằng giây, ngưỡng đầu tiên là năm 5138, còn tính bằng mili giây là đầu tháng 3 năm 1973.
Giá trị micro giây và nano giây được cắt về độ chính xác mili giây, vì các kết quả chỉ hiển thị đến mức đó. Đầu vào có phần thập phân như 1700000000.5 không được chấp nhận, nên hãy bỏ phần thập phân trước.
Số âm vẫn dùng được và cho ra ngày trước năm 1970: -86400 là ngày 31 tháng 12 năm 1969.
Đọc sáu kết quả
- Unix, giây và Unix, mili giây: cùng một thời điểm ở hai đơn vị. Phần mili giây được giữ khi bạn dán chuỗi ngày có phần thời gian như
.250; giá trị giây được làm tròn xuống. - ISO 8601: ví dụ
2023-11-14T22:13:20.000Z. Luôn theo UTC, được đánh dấu bằngZ, với độ chính xác mili giây. Đây là định dạng an toàn nhất cho API và JSON, vì nó sắp xếp đúng khi so sánh như văn bản và mọi ngôn ngữ lập trình đều phân tích được. - UTC: kiểu ngày của HTTP,
Tue, 14 Nov 2023 22:13:20 GMT, dùng trong các headerExpires,Last-Modifiedvà cookie. - Múi giờ của bạn: ngày/tháng/năm với đồng hồ 24 giờ, theo sau là tên viết tắt của múi giờ (hoặc độ lệch GMT nếu không có tên viết tắt) và tên múi giờ mà trình duyệt báo, như
Asia/Ho_Chi_Minh. Giờ mùa hè được áp dụng theo đúng ngày đó, không phải theo độ lệch của hôm nay. - Tương đối: cách diễn đạt như "hôm qua", "3 ngày nữa" hay "2 năm trước". Nó cố ý chỉ mang tính gần đúng: tháng được tính trung bình khoảng 30,4 ngày, và giá trị tự cập nhật khi trang đang mở.
Chuyển ngày tháng thành timestamp
Bạn có thể dán một ngày thay vì một con số. Chuỗi ISO 8601 là đầu vào đáng tin cậy nhất, và các quy tắc múi giờ đáng để nắm rõ vì chúng gây ra phần lớn lỗi lệch vài giờ:
2024-05-01T12:00:00Zvà2024-05-01T12:00:00+02:00mang sẵn độ lệch của chúng và không thể hiểu nhầm.2024-05-01không có giờ được coi là nửa đêm UTC.2024-05-01T12:00và2024-05-01 12:00, tức ngày có giờ nhưng không có độ lệch, được coi là giờ địa phương của bạn.
Vì vậy nếu bạn ở Berlin vào mùa hè, 2024-05-01 và 2024-05-01 00:00 lệch nhau hai giờ. Khi chuyển đổi cho máy chủ hoặc API, hãy thêm Z hoặc độ lệch rõ ràng để khỏi phải đoán.
Các định dạng khác, như May 1, 2024 12:00, phụ thuộc vào bộ phân tích ngày của trình duyệt và có thể hoạt động khác nhau giữa Chrome, Firefox và Safari. Định dạng có ngày đứng trước, như 01/05/2024, sẽ bị đọc là tháng đứng trước theo kiểu Mỹ hoặc bị từ chối, nên hãy tránh chúng.
Những cạm bẫy đáng biết
- Giây nhuận. Thời gian Unix giả định mọi ngày có đúng 86.400 giây. 27 giây nhuận được thêm từ năm 1972 không được tính, điều này chỉ quan trọng với việc đo thời gian khoa học chính xác.
- Sự cố năm 2038. Các hệ thống lưu thời gian Unix dưới dạng số nguyên có dấu 32 bit sẽ bị tràn tại
2147483647, tức 19 tháng 1 năm 2038, 03:14:07 UTC. Dán con số đó vào để xem. Hệ thống 64 bit hiện đại không bị ảnh hưởng, nhưng thiết bị nhúng cũ và một số định dạng tệp thì có thể. - Lệch đồng hồ. Nếu JWT bị từ chối với lý do "chưa có hiệu lực" hoặc "đã hết hạn", hãy so sánh
iatvàexpcủa nó với Thời gian Unix hiện tại đang chạy ở đầu trang. Chênh lệch vài phút cho thấy đồng hồ bị sai chứ không phải token hỏng.
Để đọc các claim của token, hãy giải mã phần giữa bằng Bộ mã hóa và giải mã Base64 và sắp xếp JSON gọn gàng bằng Định dạng và kiểm tra JSON. Việc chuyển đổi chạy trong trình duyệt, dùng đồng hồ và thiết lập múi giờ của chính nó.