如何修改代码以显示带毫秒的日期和时间?
解决C语言中输出带毫秒的日期时间问题
嘿,我懂你的困扰——strftime()确实没法直接输出毫秒,因为它的格式化参数里根本没有对应毫秒的占位符。不过咱们可以换个思路,结合高精度时间接口来补上这部分信息,下面给你具体的解决方案:
首先,你的原代码已经把秒级时间格式化成了YYYY MM DD HH:MM:SS.的形式,差的就是后面三位毫秒数。要获取毫秒,咱们可以用POSIX标准的clock_gettime()函数(类Unix系统如Linux、macOS支持),它能拿到纳秒级的时间精度,咱们把纳秒除以1000000就能得到毫秒。
修改后的完整代码如下:
#include <time.h> #include <stdlib.h> #include <stdio.h> #define TIME_SIZE 25 // 足够容纳"YYYY MM DD HH:MM:SS.xxx"的长度(留有余量) char *time_with_ms() { const struct tm *tm; size_t len; time_t now_sec; struct timespec ts; char *s; // 获取包含纳秒的当前系统时间 if (clock_gettime(CLOCK_REALTIME, &ts) != 0) { // 系统调用失败时返回NULL,实际项目里可以加错误日志 return NULL; } now_sec = ts.tv_sec; tm = localtime(&now_sec); // 分配内存,记得后续要free s = (char *)malloc(TIME_SIZE * sizeof(char)); if (!s) { return NULL; } // 先格式化秒级时间,保留末尾的点 len = strftime(s, TIME_SIZE, "%Y %m %d %H:%M:%S.", tm); // 追加三位毫秒数,用%03ld确保不足三位时补零 snprintf(s + len, TIME_SIZE - len, "%03ld", ts.tv_nsec / 1000000); return s; }
几个关键点说明:
- 高精度时间获取:
clock_gettime(CLOCK_REALTIME, &ts)会把当前时间存入timespec结构体,其中tv_sec是秒数,tv_nsec是纳秒数(范围0-999999999),除以1000000就得到0-999的毫秒值。 - 内存安全:一定要检查
malloc的返回值,避免空指针;另外调用完这个函数后,记得用free()释放返回的字符串,防止内存泄漏。 - Windows平台适配:如果是在Windows上开发,
clock_gettime()不是标准函数,你可以改用GetLocalTime()获取系统时间(包含毫秒的wMilliseconds字段),逻辑更简单:先格式化秒级部分,再把wMilliseconds追加到后面即可。
举个使用例子:
int main() { char *t = time_with_ms(); if (t) { printf("%s\n", t); free(t); } return 0; }
输出会是类似2024 05 20 14:35:22.456这样带毫秒的时间。
内容的提问来源于stack exchange,提问作者frescoF
相关产品推荐
相关产品推荐

