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

为Apache AGE实现基于SYSTEMTIME的Windows版clock_gettime()

实现接收SYSTEMTIME参数的clock_gettime函数(MSVC环境)

针对Apache-Age编译时遇到的MSVC不支持CLOCK_REALTIME参数的问题,这里提供一个直接接收SYSTEMTIME参数、输出timespec结构体的自定义clock_gettime实现:

函数实现

#include <windows.h>
#include <time.h>

int clock_gettime(SYSTEMTIME* st, struct timespec* ts) {
    // 空指针检查
    if (!st || !ts) {
        return -1;
    }

    FILETIME ft;
    // 将SYSTEMTIME转换为FILETIME(以100纳秒为单位的UTC时间)
    SystemTimeToFileTime(st, &ft);

    // 用ULARGE_INTEGER处理64位时间值
    ULARGE_INTEGER uli;
    uli.LowPart = ft.dwLowDateTime;
    uli.HighPart = ft.dwHighDateTime;

    // 转换为秒和纳秒
    const unsigned long long hundred_ns_per_sec = 10000000ULL;
    ts->tv_sec = (time_t)(uli.QuadPart / hundred_ns_per_sec);
    ts->tv_nsec = (long)((uli.QuadPart % hundred_ns_per_sec) * 100);

    return 0;
}

使用说明

  1. 将上述代码添加到项目中(比如单独写一个win_clock.c文件,或者直接嵌入agetype.c)
  2. 在agetype.c调用clock_gettime之前,添加函数声明:
    int clock_gettime(SYSTEMTIME* st, struct timespec* ts);
    
  3. 原代码中GetSystemTime(&st); clock_gettime(&st, &ts);的调用逻辑可以直接保留,无需修改

逻辑说明

  • SYSTEMTIME通过SystemTimeToFileTime转换为FILETIME,后者是Windows系统中便于计算的64位时间格式(单位为100纳秒)
  • 利用ULARGE_INTEGER对64位时间值做除法和取余,分别得到秒数和剩余的100纳秒数,再转换为纳秒
  • 返回值0表示成功,-1表示参数非法(空指针)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:02:07