Я мигрирую некоторый код с vc120 на vc140, и у меня возникла проблема с ftime64. Проблема похожа на ту, что упоминается на Сообщество разработчиков Visual Studio где ftime64, кажется, имеет ошибка 2038 года в 2015/2017 но где 2013 нет.
Вот пример кода:
#include "stdafx.h"#include <sys/timeb.h>
int main()
{
__timeb64 testTime64;
_ftime64(&testTime64);
printf("%lld\n", testTime64.time);
return 0;
}
С датами после 03:14:07 UTC 2038/01/19, время, кажется, пересекает 32-битную границу.
Чтобы протестировать, скомпилируйте приведенный выше код как ftime_check и выполните следующую команду из командной строки администратора (обратите внимание, что ваши цифры будут меняться в зависимости от времени суток на ваших часах):
date 1/18/2038 && ftime_check
2147474668
date 1/20/2038 && ftime_check
-2147319812
Для справки вот (ожидаемый) вывод, как видно из vc120:
date 1/18/2038 && ftime_check
2147482944
date 1/20/2038 && ftime_check
2147655752
Я вижу ту же проблему со всеми этими функциями ftime, _ftime, _ftime64, _ftime_s и _ftime64_s
Кто-нибудь еще испытывает это, и как вы работаете с этим?
Открыв проблему с поддержкой Microsoft Visual Studio, они подтвердили это как ошибку в Universal CRT, которую можно исправить с помощью обновленного Windows SDK, который планируется выпустить вместе с Windows 10 Redstone 3 (также известной как Fall Creators Update). Обновленный UCRT также будет выпущен вместе с RS3.
Обновление 2018/05/08: В Fall Creator’s Update (1709) это исправлено для приложений, динамически связывающихся с CRT (/ MD и / MDd). Но чтобы исправить это при статической привязке к CRT (/ MT и / MTd), необходимо изменить версию целевой платформы на 10.0.16299.0 (или позже) и пересоберите приложение.
Внутренний идентификатор ошибки: DevDiv.436129, 437701
Варианты обхода проблемы:
GetSystemTime (SYSTEMTIME * lpSystemTime)
SystemTimeToFileTime (const SYSTEMTIME * lpSystemTime, FILETIME * lpFileTime)
Требуется Windows 8 или выше:
GetSystemTimePreciseAsFileTime (FILETIME * lpSystemTimeAsFileTime)
Конвертировать SYSTEMTIME в FILETIME
SYSTEMTIME начинается в 1601 году, а time_t обычно начинается в 1970 году.
Чтобы преобразовать в time_t, вы должны учитывать разницу в секундах между 1601 и 1970 годами (см .: Конвертировать время файла Windows в секунду в Unix / Linux)
Других решений пока нет …