Почему максимальный FILETIME не подходит как универсальная метка «никогда»

У типа FILETIME два 32-битных поля, но не каждый набор битов безопасно передавать во все функции работы со временем. Попытка использовать максимальное значение 0xFFFFFFFFFFFFFFFF как метку «позже любой даты» может привести к неожиданному поведению.

Предел зависит от операции

Значение 0xFFFFFFFFFFFFFFFF может использоваться как специальный маркер внутри конкретного кода, который знает его смысл. Однако некоторые API интерпретируют такие биты иначе. Например, вызов SetFileTime может рассматривать отдельные битовые комбинации как запрещающие обновление соответствующего временного поля через данный дескриптор.

Кроме того, документация к преобразованию FileTimeToSystemTime требует, чтобы входное значение было строго меньше 0x8000000000000000. Другие преобразования и среды выполнения имеют собственные диапазоны допустимых значений. Даже дата, близкая к верхнему пределу, может переполниться при последующем добавлении интервала, что приведёт к ошибке или некорректному результату.

Как корректно выразить особое состояние

Если требуется передать состояние «никогда», «отсутствует» или «без срока», надёжнее не использовать битовую заглушку в FILETIME, а передавать это состояние явно. Подходы:

  • Отдельный флаг или поле в структуре, указывающее на специальное состояние.
  • Явно nullable-тип в целевой среде (например, nullable-значение в C#).
  • Обёртки вроде std::optional в C++ для явного отсутствия значения времени.

Такие решения избавляют потребителя API от необходимости угадывать смысл больших или «необычных» битовых комбинаций и снижают риск неинтерпретируемых ошибок при преобразованиях и арифметике времени.