Последний возможный FILETIME

Я создаю макет объекта для проверки моего приложения, чтобы он работал в граничных условиях времени. Я использую FILETIME в SDK Windows.

Ссылка показывает самое раннее время, которое составляет 1 января 1601 года (я предполагаю, что в полночь 00:00:00 и dwLowDateTime и dwHighDateTime будут 0x00000000), поэтому у меня это есть. Каков последний возможный FILETIME?

Мой первый инстинкт - установить dwLowDateTime и dwHighDateTime на 0xFFFFFFFF, но затем я спросил, действительно ли это действительно время, которое мне нужно проверить, из-за того, где моя связанная страница говорит SetFileTime использует 0xFFFFFFFF, чтобы указать, что время предыдущего доступа к файлам должно быть сохранено.

Ответ 1

Я понимаю, что FILETIME было сделано для представления любого допустимого SYSTEMTIME в 64 бит. Если вы берете предел SYSTEMTIME (последняя миллисекунда в 30827), вы получаете FILETIME of 0x7fff35f4f06c58f0 с помощью SystemTimeToFileTime().

Однако, если вы поместите 0x7fffffffffffffff в FileTimeToSystemTime(), то вы попадете в год 30828, хотя эта дата недействительна для SYSTEMTIME. Любое большее значение (0x8000000000000000 и выше) приводит к ошибке FileTimeToSystemTime().

В общем, я бы рекомендовал не выходить за пределы 0x7fff35f4f06c58f0, чтобы оставаться совместимым с SYSTEMTIME.

Ответ 2

Согласно ссылке, FILETIME представляет:

... число 100-наносекундных интервалов с 1 января 1601 г. (UTC).

так что не 1 января 1970 года.

В нем также говорится

... функция SetFileTime [например] использует 0xFFFFFFFF, чтобы указать, что время предыдущего доступа файла должно быть сохранено.

Поэтому я не думаю, что вы ожидаете, что 0xFFFFFFFF будет действительным максимальным значением.

Согласно патент 6853957, диапазон составляет 30 000 лет до/после эпохи (1 января 1601 г.). Это означает, что вы можете использовать его с отрицательными датами (например, датами до эпохи).

EDIT: только что рассчитано: оно может хранить (приблизительно) 58,454 дня, составляя 100-наносекундные интервалы, поэтому +/- 30 000 лет звучит как хорошая ценность, если вы принимаете отрицательные даты курса.

Ответ 3

В этой статье MSDN есть ответ - тестовые примеры для тестирования функций реального времени RTC:

Тест ищет диапазон, начинающийся с минимально возможного FILETIME (FILETIME 0 - начало 1 января 1601 года) и заканчивается максимально возможным FILETIME (максимальное значение FILETIME - это максимальное 64-битное значение).