Последний возможный 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-битное значение).