Windows 64位环境下,如何用C++实现类似Python time.time()的Unix计时?
Windows 64位受限环境下C++实现类似Python time.time()的计时方法
Python的time.time()返回的是Unix时间戳——从1970年1月1日00:00:00 UTC到当前时刻的秒数(带小数,支持高精度)。在Windows 64位受限环境中,我们可以通过Windows原生API实现完全等价的功能,无需依赖第三方库。
核心实现思路
Windows系统使用FILETIME结构存储时间,单位为100纳秒,其时间起点是1601年1月1日00:00:00 UTC。我们需要:
- 获取当前系统的UTC时间(高精度优先)
- 将
FILETIME转换为64位整数,减去Windows epoch到Unix epoch的时间差 - 将结果转换为秒数(除以107,因为1秒=107个100纳秒单位)
完整代码示例
#include <windows.h> #include <cstdint> #include <iostream> // 获取Unix时间戳(秒,带小数,与Python time.time()等价) double get_unix_timestamp() { FILETIME ft; // 优先使用高精度API(Windows 8+支持,64位系统默认兼容) GetSystemTimePreciseAsFileTime(&ft); // 将FILETIME的高低位合并为64位整数(单位:100纳秒) uint64_t ft_total = (static_cast<uint64_t>(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; // Windows epoch到Unix epoch的时间差(11644473600秒 = 116444736000000000个100纳秒) constexpr uint64_t epoch_offset = 116444736000000000ULL; // 转换为秒级浮点数值 return static_cast<double>(ft_total - epoch_offset) / 10000000.0; } int main() { const double start_time = get_unix_timestamp(); // 模拟耗时操作 Sleep(1250); const double elapsed = get_unix_timestamp() - start_time; std::cout << "耗时: " << elapsed << " 秒" << std::endl; return 0; }
适配受限环境的备选方案
如果环境不支持GetSystemTimePreciseAsFileTime(比如极老的Windows版本),可以替换为兼容性更强的GetSystemTimeAsFileTime(&ft),精度会略有下降(通常到毫秒级),但依然能满足大部分计时需求。
关键说明
- 代码仅依赖Windows原生API,无需额外库,编译时默认链接
kernel32.lib - 64位环境下使用
uint64_t避免时间值溢出 - 返回的浮点数值与Python
time.time()完全一致,可直接用于时间差计算
内容的提问来源于stack exchange,提问作者taichi
相关产品推荐
相关产品推荐

