我正在将一些代码从vc120迁移到vc140,而我遇到了ftime64的问题。这个问题类似于Visual Studio dev community中提到的问题,其中ftime64在2015/2017年似乎有year-2038 bug但2013年没有。{/ p>
以下是一些示例代码:
#include "stdafx.h"
#include <sys/timeb.h>
int main()
{
__timeb64 testTime64;
_ftime64(&testTime64);
printf("%lld\n", testTime64.time);
return 0;
}
在2038/01/19的03:14:07 UTC之后的日期,时间似乎包裹在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
是否有其他人遇到此问题,您是如何解决这个问题的?
答案 0 :(得分:3)
在打开Microsoft Visual Studio支持问题后,他们已经确认这是Universal CRT的一个错误,可以使用更新的Windows SDK修复,该SDK将与Windows 10 Redstone 3(又名Fall Creators Update)一起发布。更新的UCRT也将与RS3一起发布。
更新2018/05/08: Fall Creator的更新(1709)修复了针对CRT(/ MD和/ MDd)动态链接的应用程序的问题。但是为了在静态链接到CRT(/ MT和/ MTd)时解决此问题,您必须将目标平台版本更改为 10.0.16299.0 (或更高版本)并重建应用程序。
内部错误ID为: 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之间的差异(参见:Convert Windows Filetime to second in Unix/Linux)