2009-04-19 28 views
25

My time.h có định nghĩa sau đây của tm:Tại sao tm_sec dao động từ 0-60 thay vì 0-59 trong thời gian.h?

struct tm { 
    int tm_sec;  /* seconds after the minute [0-60] */ 
    int tm_min;  /* minutes after the hour [0-59] */ 
    int tm_hour; /* hours since midnight [0-23] */ 
    ... 
} 

Tôi chỉ nhận thấy rằng họ tài liệu tm_sec như dao động từ 0-60 toàn diện. Tôi đã luôn luôn giả định nó dao động từ 0-59 giống như tm_min. Tôi chắc chắn không bao giờ nhìn thấy một đồng hồ đọc 10:37:60 ...

Bạn có nghĩ đây chỉ là lỗi tài liệu còn sót lại từ tập tin có nguồn gốc từ Berkley thời kỳ này không?

Hoặc có điều gì đó tinh tế hơn đang xảy ra mà tôi không biết?

Trả lời

36

Leap seconds là lý do cho việc này:

Một bước nhảy vọt thứ hai là một cộng hoặc trừ điều chỉnh một giây đến quốc tế (UTC) quy mô thời gian Coordinated mà giữ nó gần với thời gian trung bình năng lượng mặt trời.

Khi giây nhảy vọt dương được thêm vào lúc 23:59:60 UTC, nó trì hoãn sự bắt đầu của ngày UTC sau (lúc 00:00:00 UTC) một giây, làm chậm đồng hồ UTC hiệu quả.

+3

+1: đánh bại tôi sau 23 giây. Và đoán của bạn là chính xác. – dwc

+0

@dwc, chỉnh sửa câu trả lời bằng một số bằng chứng? –

+0

http://www.opengroup.org/onlinepubs/009695399/basedefs/time.h.html và nhiều địa điểm khác nói về điều này. – dwc

8

Các trang người đàn ông cho ctime giải thích rằng đây là khoảng giây nhuận:

tm_sec: Số giây sau phút, thường trong khoảng từ 0 đến 59, nhưng có thể lên đến 60 để cho phép giây nhảy vọt.

Các vấn đề liên quan