如何计算毫秒级精度的时间戳差值?
高精度时间戳差值计算方案
要处理包含毫秒的时间戳差值,核心思路是先将自定义格式的时间戳转换为包含毫秒的总时间值,再计算差值。以下是具体实现方案:
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
相关产品推荐
相关产品推荐

