Подтвердить что ты не робот

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

Структура FILETIME отсчитывает с 1 января 1601 года (предположительно, начало этого дня) согласно документации Microsoft, но включает ли это дополнительные секунды?

4b9b3361

Ответ 1

Вопрос не должен быть, если 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

Q.E.D.

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

Ответ 2

Вот еще немного информации о том, почему именно эта дата была выбрана.

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

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

На самом деле у меня есть электронное письмо от Дейва Катлера, подтверждающее это.

Ответ 3

Не может быть однозначного ответа на этот вопрос без предварительного решения: что фактически подсчитывает 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. До тех пор, пока дипломатические вопросы не будут разработаны, пока национальные правительства и международные стандарты не будут четко различать и выбирать между средними солнечными и СИ секунд, мало надежд на то, что компьютерные стандарты могут последовать примеру.

Ответ 4

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

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

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

Ответ 5

Ответ на этот вопрос раньше был нет, но изменился на: ДА, вроде как, иногда...

Согласно статье в блоге команды Windows Networking:

Начиная с Server 2019 и API времени обновления Windows 10 октября [2018], теперь будут учитываться все дополнительные секунды, которые операционная система знает, когда она переводит FILETIME в SystemTime.

Поскольку с момента добавления этой функции не было выпущено дополнительных секунд, операционная система по-прежнему не знает ни о каких дополнительных секундах. Тем не менее, когда следующая официальная дополнительная секунда пробивается в мир, компьютеры Windows, на которых включена эта новая функция, будут отслеживать ее, и, таким образом, значения FILETIME будут смещены на количество дополнительных секунд на компьютере в тот момент, когда они работают. интерпретированы.

Сообщение в блоге продолжает описывать:

В FILETIME не вносятся изменения. Он по-прежнему представляет число интервалов в 100 нс с начала эпохи. Что изменилось, так это интерпретация этого числа, когда оно конвертируется в SYSTEMTIME и обратно. Вот список затронутых API:

  • GetSystemTime
  • GetLocalTime
  • FileTimeToSystemTime
  • FileTimeToLocalTime
  • SystemTimeToFileTime
  • SetSystemTime
  • SetLocalTime

До этого выпуска у SYSTEMTIME были допустимые значения wSecond от 0 до 59. Теперь SYSTEMTIME был обновлен и теперь имеет значение 60, при условии, что год, месяц и день представляют день, в течение которого допустима дополнительная секунда.

...

Чтобы получить 60 секунд в структуре SYSTEMTIME, процесс должен явно подписаться.

Обратите внимание, что FILETIME применяется к поведению в функциях, перечисленных в том, как FILETIME отображается на SYSTEMTIME. Независимо от того, подписаны вы или нет, операционная система по-прежнему будет компенсировать значения FILETIME соответствии с дополнительными секундами, которые она знает.

Что касается совместимости, в статье говорится:

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

А также предоставляет ссылки на более раннюю публикацию, которая описывает, как отключить всю функцию, следующим образом:

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

  • HKLM:\SYSTEM\CurrentControlSet\Control\LeapSecondInformation
  • Тип: "REG_DWORD"
  • Имя: включено
  • Значение: 0 Отключает общесистемную настройку
  • Значение: 1 Включает общесистемную настройку

Далее перезагрузите вашу систему.

Ответ 6

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

UTC = (Атомное время) + (Секундомер) ~~ (Среднее солнечное время)

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

Ответ 7

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