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

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

16 голосов
/ 03 апреля 2012

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

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

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

Ответы [ 3 ]

20 голосов
/ 12 августа 2013

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

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

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

4 голосов
/ 03 апреля 2012

По ссылке FILETIME представляет:

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

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

Там также написано

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

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

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

РЕДАКТИРОВАТЬ: Только что вычислено: он может хранить (приблизительно) 58 454 дня с интервалами в 100 наносекунд, поэтому +/- 30 000 лет звучат как хорошее значение, если вы, конечно, принимаете отрицательные даты.

2 голосов
/ 03 апреля 2012

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

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

...