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

如何计算毫秒级精度的时间戳差值?

高精度时间戳差值计算方案

要处理包含毫秒的时间戳差值,核心思路是先将自定义格式的时间戳转换为包含毫秒的总时间值,再计算差值。以下是具体实现方案:

1. 解析时间戳到自定义结构体

先把YYYY DD MM HH MM SS MSC格式的字符串解析到自定义结构体,方便后续处理:

typedef struct {
    int year;
    int day;
    int month;
    int hour;
    int minute;
    int second;
    int millisecond;
} CustomTimestamp;

2. 转换为毫秒级时间戳

用mktime处理秒级部分,再加上毫秒数得到总毫秒数,直接计算差值:

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

long long timestamp_to_ms(CustomTimestamp ts) {
    struct tm tm_struct = {0};
    // mktime的年份从1900开始计数,月份从0开始
    tm_struct.tm_year = ts.year - 1900;
    tm_struct.tm_mon = ts.month - 1;
    tm_struct.tm_mday = ts.day;
    tm_struct.tm_hour = ts.hour;
    tm_struct.tm_min = ts.minute;
    tm_struct.tm_sec = ts.second;
    tm_struct.tm_isdst = -1; // 让系统自动判断夏令时

    time_t sec_epoch = mktime(&tm_struct);
    if (sec_epoch == -1) {
        perror("mktime failed");
        return -1;
    }
    return (long long)sec_epoch * 1000 + ts.millisecond;
}

long long calculate_diff_ms(CustomTimestamp ts1, CustomTimestamp ts2) {
    long long ms1 = timestamp_to_ms(ts1);
    long long ms2 = timestamp_to_ms(ts2);
    return llabs(ms1 - ms2);
}

3. 更高精度的处理(纳秒级)

如果需要纳秒级精度,可以使用struct timespec(C11及POSIX支持),将毫秒转换为纳秒存储:

int timestamp_to_timespec(CustomTimestamp ts, struct timespec *tspec) {
    struct tm tm_struct = {0};
    tm_struct.tm_year = ts.year - 1900;
    tm_struct.tm_mon = ts.month - 1;
    tm_struct.tm_mday = ts.day;
    tm_struct.tm_hour = ts.hour;
    tm_struct.tm_min = ts.minute;
    tm_struct.tm_sec = ts.second;
    tm_struct.tm_isdst = -1;

    time_t sec_epoch = mktime(&tm_struct);
    if (sec_epoch == -1) {
        perror("mktime failed");
        return -1;
    }
    tspec->tv_sec = sec_epoch;
    tspec->tv_nsec = (long long)ts.millisecond * 1000000; // 毫秒转纳秒
    return 0;
}

long long calculate_diff_ms_from_timespec(struct timespec t1, struct timespec t2) {
    long long diff_sec = t1.tv_sec - t2.tv_sec;
    long long diff_nsec = t1.tv_nsec - t2.tv_nsec;
    long long total_ms = diff_sec * 1000 + diff_nsec / 1000000;
    return llabs(total_ms);
}

关键注意点

  • mktime会受系统时区影响,如果需要统一用UTC时间,建议使用timegm(POSIX函数,类似mktime但处理UTC时间),或者提前设置环境变量TZ=UTC。
  • 解析输入时要校验日期合法性(比如月份范围、对应月份的有效天数),避免转换错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:57:19