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

如何修改代码以显示带毫秒的日期和时间?

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:47