Quan niệm sai lầm của lập trình viên về thời gian Unix

tôi xin lỗi Patrick McKenzie.

Hôm qua Danny Tôi đã hỏi về một số sự thật thú vị về thời Unix và tôi nhớ rằng đôi khi nó hoạt động hoàn toàn không trực quan.

Ba sự thật này có vẻ vô cùng hợp lý và logic phải không?

  1. Thời gian Unix là số giây kể từ ngày 1 tháng 1970 năm 00 00:00:XNUMX UTC.
  2. Nếu bạn đợi đúng một giây thì thời gian Unix sẽ thay đổi đúng một giây.
  3. Thời gian Unix không bao giờ quay ngược lại.

Không có điều nào trong số này là đúng.

Nhưng chỉ nói “Không có điều nào trong số này là đúng” mà không giải thích là chưa đủ. tại sao. Xem bên dưới để giải thích. Nhưng nếu bạn muốn tự mình suy nghĩ, đừng lướt qua hình ảnh chiếc đồng hồ!

Quan niệm sai lầm của lập trình viên về thời gian Unix
Đồng hồ để bàn từ những năm 1770 Được biên soạn bởi John Leroux. Từ Bộ sưu tập chào mừng. Xuất bản theo giấy phép CC BY

Cả ba quan niệm sai lầm đều có một lý do: giây nhuận. Nếu bạn không quen với giây nhuận, đây là tài liệu tham khảo nhanh:

Thời gian UTC được xác định bởi hai yếu tố:

  • Giờ nguyên tử quốc tế: Số đọc trung bình từ hàng trăm đồng hồ nguyên tử trên khắp thế giới. Chúng ta có thể đo giây bằng các đặc tính điện từ của một nguyên tử và đây là phép đo thời gian chính xác nhất mà khoa học biết đến.
  • Giờ thế giới, dựa trên sự tự quay của Trái Đất quanh trục của nó. Một cuộc cách mạng trọn vẹn là một ngày.

Vấn đề là hai con số này không phải lúc nào cũng trùng nhau. Vòng quay của Trái đất không đều - nó dần dần chậm lại, do đó ngày trong Giờ vũ trụ trở nên dài hơn. Mặt khác, đồng hồ nguyên tử cực kỳ chính xác và không đổi trong hàng triệu năm.

Khi hai thời điểm không đồng bộ, một giây sẽ được thêm vào hoặc xóa khỏi UTC để đưa chúng trở lại đồng bộ. Từ năm 1972 phục vụ IERS (chạy trường hợp này) đã thêm 27 giây nữa. Kết quả là 27 ngày UTC với thời lượng 86 giây. Về mặt lý thuyết, một ngày có thời lượng 401 giây (trừ một) là có thể. Cả hai lựa chọn đều mâu thuẫn với giả định cơ bản về thời gian Unix.

Thời gian Unix giả định rằng mỗi ngày kéo dài chính xác 86 giây (400 × 60 × 60 = 24), không có thêm bất kỳ giây nào. Nếu bước nhảy như vậy xảy ra thì thời gian Unix sẽ nhảy một giây hoặc đếm hai giây trong một. Tính đến năm 86, nó thiếu 400 giây nhuận.

Vì thế những quan niệm sai lầm của chúng ta cần được bổ sung như sau:

  • Thời gian Unix là số giây kể từ ngày 1 tháng 1970 năm 00 00:00:XNUMX UTC trừ giây nhuận.
  • Nếu bạn đợi đúng một giây, thời gian Unix sẽ thay đổi đúng một giây, trừ khi giây nhuận đã bị loại bỏ.

    Cho đến nay, giây chưa bao giờ bị loại bỏ trong thực tế (và tốc độ quay của Trái đất chậm lại có nghĩa là điều này khó xảy ra), nhưng nếu điều đó xảy ra, điều đó có nghĩa là ngày UTC sẽ ngắn hơn một giây. Trong trường hợp này, giây cuối cùng của UTC (23:59:59) bị loại bỏ.

    Mỗi ngày Unix có cùng số giây, vì vậy giây Unix cuối cùng của một ngày rút ngắn sẽ không tương ứng với bất kỳ thời gian UTC nào. Đây là giao diện của nó trong khoảng thời gian một phần tư giây:

    Quan niệm sai lầm của lập trình viên về thời gian Unix

    Nếu bạn bắt đầu lúc 23:59:58:00 UTC và đợi một giây, thời gian Unix sẽ tăng lên hai giây UTC và dấu thời gian Unix 101 sẽ không được gán cho bất kỳ ai.

  • Thời gian Unix không bao giờ có thể quay trở lại, cho đến khi thêm một giây nhuận.

    Điều này đã xảy ra 27 lần trong thực tế. Vào cuối ngày UTC, một giây bổ sung được thêm vào lúc 23:59:60. Unix có cùng số giây trong một ngày, vì vậy nó không thể thêm một giây nào nữa - thay vào đó, nó phải lặp lại dấu thời gian Unix cho giây cuối cùng. Đây là giao diện của nó trong khoảng thời gian một phần tư giây:

    Quan niệm sai lầm của lập trình viên về thời gian Unix

    Nếu bạn bắt đầu lúc 23:59:60.50 và đợi nửa giây, thời gian Unix trả lại nửa giây và dấu thời gian Unix 101 tương ứng với hai giây UTC.

Đây có lẽ không phải là điều kỳ lạ duy nhất của thời Unix - chỉ là những gì tôi nhớ được ngày hôm qua.

Thời gian - rất điều kỳ lạ.

Nguồn: www.habr.com

Thêm một lời nhận xét