You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。我们需要:

  1. 获取当前系统的UTC时间(高精度优先)
  2. 将FILETIME转换为64位整数,减去Windows epoch到Unix epoch的时间差
  3. 将结果转换为秒数(除以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避免时间值溢出
  • 返回的浮点数值与Pythontime.time()完全一致,可直接用于时间差计算

内容的提问来源于stack exchange,提问作者taichi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:15:16