Вопрос: Включает ли в стеке FILETIME скачок секунд?


FILETIME http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx структура рассчитывается с 1 января 1601 года (предположительно, начало этого дня) в соответствии с документацией microsoft, но включает ли это секунды?

Примечание. Хотя щедро использовать время для ответа на чужие вопросы в Интернете; если вы действительно не знаете ответа, это не очень полезно. Кроме того, 23 секунды - это не совсем неоправданно малое количество времени, о котором нужно беспокоиться. У многих оконных машин есть часы с точностью до 23 секунд.


16


источник


Ответы:


Вопрос не должен быть, если FILETIME включает в себя секунды прыжка.

Должен быть:

Делают ли люди, функции и библиотеки, которые интерпретируют FILETIME (Т.е. FileTimeToSystemTime) включают секунды прыжка при подсчете продолжительности?

Простой ответ «Нет» , FileTimeToSystemTime возвращает секунды как 0..59,


Более простой ответ: конечно, нет, как это могло быть? ».

Моя машина Windows 2000 не знает, что за десять лет было добавлено 2 прыжковых секунды с момента ее выпуска. Любая интерпретация FILETIME неправильно.


Наконец, вместо того, чтобы полагаться на логику, мы можем определить прямым экспериментальным наблюдением, ответ на вопрос плакатов:

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)));

Добавление одной секунды к

12/31/2008 11:59:59pm

дает

1/1/2009 12:00:00am

скорее, чем

1/1/2009 11:59:60pm

Что и требовалось доказать

Оригинальный постер может не понравиться, но бог намеренно сфальсифицировал его, так что год не делится на один день. Он сделал это, чтобы испортить программистов.


14



Не может быть однозначного ответа на этот вопрос без предварительного принятия решения: что фактически подсчитывает Windows FILETIME? Документы Microsoft говорят, что с 1601 по UTC насчитывается 100 наносекундных интервалов, но это проблематично.

До 1960 года не существовало формы согласованного на международном уровне времени. Название UTC само по себе не встречается ни в одной литературе до 1964 года. Название UTC как официальное обозначение не существовало до 1970 года. Но это ухудшается. Королевская Гринвичская обсерватория не была создана до 1676 года, поэтому даже попытка интерпретировать FILETIME как GMT не имеет четкого смысла, и только тогда часы маятника с точными спусками стали давать точность 1 секунды.

Если FILETIME интерпретируется как средняя солнечная секунда, то число секунд прыжка с 1601 равно нулю, поскольку UT не имеет секунд прыжка. Если FILETIME интерпретируется так, как если бы были атомные хронометры, то число секунд прыжка с 1601 составляет около -60 (это минус 60 скачкообразных секунд).

Это древняя история, как насчет эпохи с атомных хронометров? Это не лучше, потому что национальные правительства не сделали различия между средними солнечными секундами и секундами СИ. В течение десятилетия МСЭ-R обсуждает отказ от прыжковых секунд, но они не достигли международного консенсуса. Часть причины этого можно увидеть в javascript на этой странице  (также см. ссылку delta-T на этой странице для сюжетов древней истории). Поскольку национальные правительства не сделали четкого различия, любая попытка определить количество секунд с 1972 года несет риск быть недействительным в соответствии с законами какой-либо юрисдикции. Делегаты МСЭ-R знают об этой сложности, как и люди в комитете POSIX. До тех пор, пока не будут разработаны дипломатические вопросы, пока национальные правительства и международные стандарты не будут четко различать и выбирать между средним солнечным и сильным секундами, мало надежд на то, что компьютерные стандарты последуют этому примеру.


8



Вот Дополнительная информация о том, почему была выбрана эта конкретная дата.

Структура FILETIME записывает время в   форма 100-наносекундных интервалов   с 1 января 1601 года. Почему   выбранная дата?

Григорианский календарь работает на   400-летний цикл, а 1601 - первый   год цикла, который был активен в   время Windows NT   разработан. Другими словами, это было   выбранный, чтобы вывести математику   мило.

У меня есть письмо от Dave   Катлер подтверждает это.


8



IERS может непредсказуемо наскочить. 23 секунды были добавлены с 1972 года, когда были определены UTC и секунды прыжка. Википедия говорит, что «поскольку скорость вращения Земли непредсказуема в долгосрочной перспективе, невозможно предсказать необходимость в них более чем за шесть месяцев».

Поскольку вам нужно было бы сохранить историю, когда вставлялись секунды прыжка, и продолжайте обновлять ОС, чтобы сохранить ссылку, когда они были вставлены, а разница настолько мала, справедливо не ожидать, что ОС общего назначения компенсировать секунды прыжка.

Кроме того, обычный часовой дрейф простых электронных часов на вашем ПК по сравнению с UTC намного больше, чем компенсация, требуемая для секунд прыжка. Если вам нужна точность, чтобы компенсировать прыжковые секунды, вы не должны использовать очень неточные часы ПК.


2



Очень грубое резюме:

UTC = (атомное время) + (прыжки секунд) ~~ (среднее солнечное время)

Документация MS говорит, в частности, «UTC», и поэтому должна включать в себя секунды прыжка. Как всегда с MS, ваш пробег может отличаться.


0



Согласно этому комментарий  окна полностью не знают о прыжковых секундах. Если вы добавите 24 * 60 * 60 секунд к FILETIME, который сегодня представляет 1:39:45, вы получите FILETIME, который будет представлять 1:39:45 завтра, несмотря ни на что.


0