C语言如何生成YYYY-MM-DDTHH:MM:SS.SSS+HH:MM格式时间戳
解决方法
你遇到的两个问题可以分别通过高精度时间接口获取毫秒、格式化时区字符串处理冒号的需求,以下是可直接运行的实现:
实现代码(兼容非GNU环境版本)
#include <stdio.h> #include <time.h> #include <sys/time.h> void current_time(char* str) { struct timeval tv; struct tm* tm_info; char time_main[32] = {0}; char tz_raw[8] = {0}; char tz_formatted[8] = {0}; long msec; // 获取带微秒精度的当前时间 gettimeofday(&tv, NULL); tm_info = localtime(&tv.tv_sec); // 格式化年月日时分秒部分 strftime(time_main, sizeof(time_main), "%FT%T", tm_info); // 计算毫秒值(微秒除以1000,补前导0到3位) msec = tv.tv_usec / 1000; // 格式化原始时区字符串(格式为±HHMM) strftime(tz_raw, sizeof(tz_raw), "%z", tm_info); // 给时区插入冒号,转为±HH:MM格式 snprintf(tz_formatted, sizeof(tz_formatted), "%c%c%c:%c%c", tz_raw[0], tz_raw[1], tz_raw[2], tz_raw[3], tz_raw[4]); // 拼接所有部分输出 snprintf(str, 50, "%s.%03ld%s", time_main, msec, tz_formatted); } int main(void) { char str[50]; current_time(str); printf("%s\n", str); }
说明
- 若你的运行环境使用GNU glibc(多数Linux发行版默认),可以省略手动处理时区的步骤,直接用
strftime的%:z格式符直接输出带冒号的时区,代码会更简洁。 - Windows平台下没有
gettimeofday接口,可以替换为GetLocalTimeAPI获取毫秒精度的时间,整体拼接逻辑保持一致即可。
内容的提问来源于stack exchange,提问作者babon
相关产品推荐
相关产品推荐

