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.
Nguồn
2010-08-30 18:10:49
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
@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. –
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