2008-09-24 26 views
15

Số FILETIME http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx tính từ ngày 1 tháng 1 năm 1601 (có lẽ là ngày bắt đầu của ngày đó) theo tài liệu của microsoft, nhưng điều này có bao gồm số giây nhuận không?Cấu trúc FILETIME của windows có bao gồm các giây nhảy vọt không?

Lưu ý: Mặc dù hào phóng khi sử dụng thời gian đó để trả lời câu hỏi của người lạ trên internet; nếu bạn không thực sự biết câu trả lời, nó sẽ không trở nên đặc biệt hữu ích. Ngoài ra, 23 giây không phải là một khoảng thời gian hoàn toàn không đáng kể đáng lo ngại. Nhiều máy cửa sổ có đồng hồ chính xác trong vòng 23 giây.

Trả lời

13

Câu hỏi không nên là nếu FILETIME bao gồm số giây nhảy vọt.

Nó nên là:

Do nhân dân, chức năng, và các thư viện, người giải thích một FILETIME (ví dụ: FileTimeToSystemTime) bao gồm giây nhuận khi đếm thời gian?

Câu trả lời đơn giản là "không". FileTimeToSystemTime trả về giây là 0..59.


Câu trả lời đơn giản là: "tất nhiên không, làm thế nào có thể nó?".

Máy Windows 2000 của tôi không biết rằng có 2 giây nhảy vọt được thêm vào trong thập kỷ kể từ khi nó được phát hành. Bất kỳ sự giải nghĩa nào mà nó làm cho một số FILETIME đều sai.


Cuối cùng, chứ không phải dựa trên logic, chúng ta có thể xác định bằng cách quan sát thực nghiệm trực tiếp, câu trả lời cho các áp phích câu hỏi:

var 
    systemTime: TSystemTime; 
    fileTime: TFileTime; 
begin 
    //Construct a system-time for the 12/31/2008 11:59:59 pm 
    ZeroMemory(@systemTime, SizeOf(systemTime)); 
    systemtime.wYear := 2008; 
    systemTime.wMonth := 12; 
    systemTime.wDay := 31; 
    systemTime.wHour := 23; 
    systemtime.wMinute := 59; 
    systemtime.wSecond := 59; 

    //Convert it to a file time 
    SystemTimeToFileTime(systemTime, {var}fileTime); 

    //There was a leap second 12/31/2008 11:59:60 pm 
    //Add one second to our filetime to reach the leap second 
    filetime.dwLowDateTime := fileTime.dwLowDateTime+10000000; //10,000,000 * 100ns = 1s 

    //Convert the filetime, sitting on a leap second, to a displayable system time 
    FileTimeToSystemTime(fileTime, {var}systemTime); 

    //And now print the system time 
    ShowMessage(DateTimeToStr(SystemTimeToDateTime(systemTime))); 

Thêm một giây để

12/31/2008 11:59:59pm 

cho

1/1/2009 12:00:00am 

thay vì

1/1/2009 11:59:60pm 

Q.E.D.

Áp phích gốc có thể không thích, nhưng Thiên Chúa cố tình gian lận nó để một năm không chia hết cho một ngày. Ông đã làm nó chỉ để vít lên lập trình viên.

+0

Máy chủ Windows 2000 của bạn có thể * biết * giây nhảy thêm được thêm vào kể từ khi nó được phát hành nếu nó tham vấn máy chủ NTP và theo dõi trường LI trong phản hồi của họ. – Pacerier

+0

@Pacerier Thật không may là chỉ nói với hệ điều hành nếu một bước nhảy vọt thứ hai sẽ được chèn vào cuối ngày. Rất tiếc, máy chủ NTP không báo cáo danh sách tất cả các giây nhảy đã xảy ra từ trước khi NTP được phát minh; hoặc tất cả các giây nhảy vọt tôi đã bỏ lỡ trước khi cài đặt hệ điều hành của mình hoặc bất kỳ ngày nào máy chủ của tôi bị tắt. –

+0

Tôi đã không nói rằng NTP báo cáo một danh sách tất cả các giây nhuận đã xảy ra. Máy chủ Windows 2000 của bạn có thể biết số giây nhảy vọt được thêm vào kể từ khi nó được phát hành nếu ** nó ** truy vấn máy chủ NTP ** và ** theo dõi trường LI trong phản hồi của chúng. Hệ điều hành đọc trường được cung cấp bởi máy chủ NTP, và nó theo dõi * *, có lẽ bằng cách lưu nó vào hệ thống vv. Rõ ràng, hệ điều hành có thể làm nhiều hơn nữa, ví dụ bao gồm tư vấn một dịch vụ web trực tuyến từ Microsoft mỗi một lần một thời gian để đảm bảo hồ sơ của nó không bị làm nóng ... – Pacerier

0

Một bản tóm tắt rất thô:

UTC = (Atomic Time) + (Leap Giây) ~~ (Mean Time năng lượng mặt trời)

Các tài liệu MS nói, cụ thể, "UTC", và vì vậy nên bao gồm giây nhảy vọt. Như mọi khi với MS, số dặm của bạn có thể thay đổi.

2

Số giây nhảy vọt được thêm vào không thể đoán trước bởi IERS. 23 giây đã được thêm từ năm 1972, khi UTC và giây nhảy vọt được xác định. Wikipedia nói "bởi vì tốc độ quay của Trái đất là không thể đoán trước trong dài hạn, nên không thể dự đoán trước nhu cầu của họ trước hơn sáu tháng."

Vì bạn phải giữ lại lịch sử khi giây nhảy vọt được chèn vào và tiếp tục cập nhật hệ điều hành để giữ tham chiếu khi được chèn vào và sự khác biệt quá nhỏ, không công bằng -hệ điều hành đích để bù cho giây nhuận.

Ngoài ra, độ trễ đồng hồ thông thường, của đồng hồ điện tử đơn giản trong máy tính của bạn so với UTC, lớn hơn rất nhiều so với mức bồi thường cần thiết cho giây nhảy vọt. Nếu bạn cần loại chính xác để bù cho giây nhuận, bạn không nên sử dụng đồng hồ PC không chính xác cao.

0

Theo điều này, comment cửa sổ hoàn toàn không biết về giây nhảy vọt. Nếu bạn thêm 24 * 60 * 60 giây vào FILETIME đại diện cho 1:39:45 ngày hôm nay, bạn sẽ nhận được một FILETIME đại diện cho 1:39:45 vào ngày mai, bất kể điều gì.

7

Here 's một số thông tin khác về lý do tại sao ngày cụ thể đó được chọn.

Các FILETIME hồ sơ cấu trúc thời gian trong dưới dạng khoảng 100 nano giây kể từ ngày 01 tháng 1, 1601. Tại sao mà ngày đã chọn?

Lịch Gregorian hoạt động trên một chu kỳ 400 năm, và năm 1601 là năm đầu tiên của chu kỳ đó đã hoạt động tại thời Windows NT đã được thiết kế. Nói cách khác, đó là được chọn để làm cho toán học xuất hiện độc đáo.

Tôi thực sự có email từ Dave Trình xử lý xác nhận điều này.

+0

+1 cho liên kết Raymond Chen –

8

Không thể có câu trả lời duy nhất cho câu hỏi này mà không cần quyết định trước: Windows FILETIME thực sự đếm là gì? Các tài liệu của Microsoft nói rằng nó đếm 100 nano giây kể từ 1601 UTC, nhưng điều này là có vấn đề.

Không có hình thức thời gian phối hợp quốc tế nào tồn tại trước năm 1960. Bản thân tên UTC không xảy ra trong bất kỳ tài liệu nào trước năm 1964.Cái tên UTC như một tên gọi chính thức không tồn tại cho đến năm 1970. Nhưng nó trở nên tồi tệ hơn. Đài quan sát Hoàng gia Greenwich đã không được thiết lập cho đến năm 1676, vì vậy ngay cả khi cố gắng giải thích FILETIME như GMT không có ý nghĩa rõ ràng, và nó chỉ xung quanh sau đó đồng hồ lắc với chính xác escapements bắt đầu cung cấp cho accuracies 1 giây.

Nếu FILETIME được hiểu là giây mặt trời trung bình thì số giây nhảy vọt kể từ 1601 bằng 0, đối với UT không có giây nhảy vọt. Nếu FILETIME được hiểu là nếu đã có chronometer nguyên tử thì số giây nhảy vọt kể từ 1601 là khoảng -60 (đó là 60 giây nhảy vọt).

Đó là lịch sử cổ đại, về thời đại kể từ thời gian nguyên tử? Nó không tốt hơn bởi vì chính phủ quốc gia đã không phân biệt giữa giây mặt trời trung bình và giây SI. Trong một thập kỷ, ITU-R đã thảo luận về việc bỏ qua những giây nhảy vọt, nhưng họ đã không đạt được sự đồng thuận quốc tế. Một phần lý do có thể thấy trong số javascript on this page (cũng xem liên kết delta-T trên trang đó cho các ô của lịch sử cổ đại). Bởi vì chính phủ quốc gia đã không phân biệt rõ ràng, bất kỳ nỗ lực nào để xác định số giây kể từ năm 1972 đều có nguy cơ bị vô hiệu theo luật của một số khu vực pháp lý. Các đại biểu của ITU-R nhận thức được sự phức tạp này, cũng như những người trong ủy ban POSIX. Cho đến khi các vấn đề ngoại giao được giải quyết, cho đến khi các chính phủ quốc gia và các tiêu chuẩn quốc tế đưa ra sự phân biệt rõ ràng và sự lựa chọn giữa năng lượng mặt trời trung bình và SI giây, có rất ít hy vọng rằng các tiêu chuẩn máy tính có thể phù hợp.

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