【问题标题】:Visual Studio 2015/2017 Year 2038 bug with ftime functions带有 ftime 函数的 Visual Studio 2015/2017 年 2038 错误
【发布时间】:2017-06-20 22:46:03
【问题描述】:

我正在将一些代码从 vc120 迁移到 vc140,但我遇到了 ftime64 的问题。这个问题类似于Visual Studio dev community 中提到的问题,其中 ftime64 在 2015/2017 年似乎有一个year-2038 bug,但 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 都存在同样的问题

还有其他人遇到过这种情况吗?您是如何解决的?

【问题讨论】:

  • 您可能希望将其编辑为minimal reproducible example,这样我们就可以尝试它而无需添加丢失的位或将我们的系统时钟设置为 2040 并弄乱 cookie、证书、许可证等。
  • 根据the documentation _timeb64 应该可以到 3000 年 12 月 31 日。您是如何得出它不起作用的结论的?
  • @DaveS - 我用一些额外的步骤更新了它。你必须调整你的时钟来测试这个。
  • 2526338561 看起来有点可疑,因为它对应于 2050-01-21 00:42:41 UTC。
  • @HowardHinnant 哎呀复制/粘贴失败。更新帖子。

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


【解决方案1】:

在打开 Microsoft Visual Studio 支持问题后,他们确认这是通用 CRT 的一个错误,可以通过使用与 Windows 10 Redstone 3(又名秋季创意者更新)一起发布的更新的 Windows SDK 来修复。更新后的 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 之间的秒数差异(参见:Convert Windows Filetime to second in Unix/Linux

【讨论】:

  • 从好的方面来说,UCRT 是作为操作系统的一部分提供的,因此您无需更新与您的应用程序捆绑在一起的可再发行组件。
  • 但不利的一面是,您必须强制最终用户在目标机器上安装 UCRT。此外,如果您要针对运行时静态链接(我要解决目标计算机上未安装 UCRT 的问题,即 Windows 7),您必须更新您的软件部署才能获得修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2017-06-14
  • 1970-01-01
  • 2017-10-27
  • 2018-04-27
  • 1970-01-01
  • 2015-11-01
相关资源
最近更新 更多