Visual Studio 2015/2017 2038年的ftime函数错误

时间:2017-06-20 22:46:04

标签: c++ c visual-studio-2015 visual-studio-2017 year2038

我正在将一些代码从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

是否有其他人遇到此问题,您是如何解决这个问题的?

1 个答案:

答案 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