4

我正在将一些代码从 vc120 迁移到 vc140,我遇到了 ftime64 的问题。该问题类似于Visual Studio 开发社区中提到的问题,其中 ftime64 在 2015/2017 年似乎有一个2038 年的错误,但 2013 年没有。

这是一些示例代码:

#include "stdafx.h"
#include <sys/timeb.h>
int main()
{
  __timeb64 testTime64;  
  _ftime64(&testTime64);  
  printf("%lld\n", testTime64.time);  
  return 0;
} 

对于 2038 年 1 月 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 都存在相同的问题

有没有其他人遇到过这种情况,你是如何解决这个问题的?

4

1 回答 1

3

在打开 Microsoft Visual Studio 支持问题后,他们已确认这是通用 CRT 的错误,可以通过使用更新的 Windows SDK 修复,该 SDK 将与 Windows 10 Redstone 3(又名 Fall Creators Update)一起发布。更新的 UCRT 也将与 RS3 一起发布。

2018 年 5 月 8 日更新:秋季创作者更新 (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 年之间的秒数差异(请参阅:在 Unix/Linux 中将 Windows 文件时间转换为秒

于 2017-07-18T19:18:17.790 回答