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

关于gettimeofday的技术问题:无空格显示时间与无数组格式化时间

让我来一步步解答你的两个问题:

问题1:如何使用gettimeofday函数显示当前时间且不使用空格?

要实现无空格的时间输出,核心是调整时间格式的拼接方式,全程避免插入空格。具体可以通过两种方式实现:

方式一:修改strftime格式字符串

利用strftime生成无空格的时间前缀,再拼接微秒部分:

#include <stdio.h>
#include <sys/time.h>
#include <time.h>

int main() {
    struct timeval tv;
    time_t curtime;
    gettimeofday(&tv, NULL);
    curtime = tv.tv_sec;
    
    // 把原格式中的空格去掉,比如将"%m-%d-%Y %T"改为"%m-%d-%Y%T"
    char buffer[30];
    strftime(buffer, sizeof(buffer), "%m-%d-%Y%T.", localtime(&curtime));
    printf("%s%ld\n", buffer, tv.tv_usec);
    // 输出示例:09-15-202414:35:22.123456
    return 0;
}

方式二:直接printf输出时间字段(无需临时缓冲区)

如果不想用数组,还可以直接解析tm结构体的成员,用printf直接输出所有时间部分:

#include <stdio.h>
#include <sys/time.h>
#include <time.h>

int main() {
    struct timeval tv;
    struct tm *local_tm;
    gettimeofday(&tv, NULL);
    local_tm = localtime(&tv.tv_sec);
    
    // 逐个输出时间字段,全程无空格
    printf("%02d-%02d-%04d%02d:%02d:%02d.%ld\n",
           local_tm->tm_mon + 1,  // tm_mon从0开始计数,需+1
           local_tm->tm_mday,
           local_tm->tm_year + 1900,  // tm_year是1900年以来的偏移量,需+1900
           local_tm->tm_hour,
           local_tm->tm_min,
           local_tm->tm_sec,
           tv.tv_usec);
    return 0;
}

问题2:无需数组存储时间tick数,直接格式化为指定格式?

当然可以!你原来的代码用char buffer[30]暂存格式化结果,其实完全可以跳过这个缓冲区,直接将时间输出到目标流(比如标准输出),从而节省这部分内存。

核心思路是直接解析tm结构体的各个字段,用printf直接输出,不需要额外的数组来中转。优化后的代码如下:

#include <stdio.h>
#include <sys/time.h>
#include <time.h>

int main() {
    struct timeval tv;
    struct tm local_tm_struct;
    struct tm *local_tm;
    
    gettimeofday(&tv, NULL);
    // 多线程环境建议用localtime_r避免竞态问题
    local_tm = localtime_r(&tv.tv_sec, &local_tm_struct);
    
    // 直接输出指定格式"%m-%d-%Y %T",加上微秒,无需额外数组
    printf("%02d-%02d-%04d %02d:%02d:%02d.%ld\n",
           local_tm->tm_mon + 1,
           local_tm->tm_mday,
           local_tm->tm_year + 1900,
           local_tm->tm_hour,
           local_tm->tm_min,
           local_tm->tm_sec,
           tv.tv_usec);
    return 0;
}

内存节省的原理

原来的代码需要分配30字节的数组来暂存strftime的结果,现在直接通过printf把各个时间字段输出到目标流,完全不需要额外的内存缓冲区。对于内存受限的场景(比如嵌入式设备),这种方式会更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:56:05