Включает ли структура файлового времени Windows високосные секунды?

StackOverflow https://stackoverflow.com/questions/130573

Вопрос

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

Это было полезно?

Решение

Вопрос не должен заключаться в том, если 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.

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

Другие советы

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

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

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

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

На этот вопрос не может быть однозначного ответа без предварительного принятия решения:Что на самом деле подсчитывает ФАЙЛОВОЕ ВРЕМЯ Windows?В документах Microsoft говорится, что он насчитывает 100 наносекундных интервалов с 1601 UTC, но это проблематично.

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

Если FILETIME интерпретируется как среднее значение солнечных секунд, то количество високосных секунд с 1601 года равно нулю, поскольку UT не имеет високосных секунд.Если ФАЙЛОВОЕ ВРЕМЯ интерпретируется так, как если бы существовали атомные хронометры, то число високосных секунд с 1601 года составляет около -60 (это минус 60 високосных секунд).

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

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

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

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

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

За статья в блоге сетевой команды Windows:

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

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

Далее в сообщении в блоге описывается:

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

  • Получает системное время
  • GetLocalTime
  • FileTimeToSystemTime Файловое время
  • FileTimeToLocalTime Файловое время
  • SystemTimeToFileTime Системное время
  • Устанавливает системное время
  • SetLocalTime Установить время ожидания

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

...

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

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

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

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

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

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

  • HKLM:\SYSTEM\CurrentControlSet\Control\LeapSecondInformation
  • Тип:"REG_DWORD" (РЕГИСТРАЦИОННОЕ СЛОВО)
  • Имя:Включенный
  • Значение: 0 Отключает общесистемную настройку
  • Значение: 1 Включает общесистемную настройку

Затем перезагрузите свою систему.

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

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

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

В соответствии с этим Комментарий windows совершенно не знает о високосных секундах.Если вы добавите 24 * 60 * 60 секунды к ФАЙЛОВОМУ времени, которое соответствует 1:39:45 сегодня, вы получите файловое время, которое соответствует 1:39:45 завтра, несмотря ни на что.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top