【Linux编程】如何将gettimeofday获取的时间信息转换成可显示的字符串时间?

架构师李肯 发表于 2022/08/31 20:33:33 2022/08/31
【摘要】 【Linux编程】如何将gettimeofday获取的时间信息转换成可显示的字符串时间?

大家在平时的项目中,一定经常面临打日志信息的问题,在打日志这个问题上,大家有时一定会非常关注【时间戳】这个信息点。

想必大家也很经常使用【gettimeofday】接口来获取当前的系统时间,但是很遗憾的是,它获取的时间信息是存储在一个叫strcut timeval的结构体中。那么如何将这个结构体的时间信息转换为可是显示的时间字符串呢?

比如显示 “2018-12-10 20:52:00”。本文就将给你答案,直接附上代码:

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

//由struct timeval结构体数据(由gettimeofday获取到的)转换成可显示的时间字符串
static char * get_local_time(char *time_str, int len, struct timeval *tv)
{
    struct tm* ptm;
    char time_string[40];
    long milliseconds;
    
    ptm = localtime (&(tv->tv_sec));

    /* 格式化日期和时间,精确到秒为单位。*/
    //strftime (time_string, sizeof(time_string), "%Y/%m/%d %H:%M:%S", ptm); //输出格式为: 2018/12/09 10:48:31.391
    //strftime (time_string, sizeof(time_string), "%Y|%m|%d %H-%M-%S", ptm); //输出格式为: 2018|12|09 10-52-28.302
    //strftime (time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", ptm); //输出格式为: 2018-12-09 10:52:57.200
    strftime (time_string, sizeof(time_string), "%Y\\%m\\%d %H-%M-%S", ptm); //输出格式为: 2018\12\09 10-52-28.302

    /* 从微秒计算毫秒。*/
    milliseconds = tv->tv_usec / 1000;

    /* 以秒为单位打印格式化后的时间日期,小数点后为毫秒。*/
    snprintf (time_str, len, "%s.%03ld", time_string, milliseconds);

    return time_str;
}

int main(int argc, const char **argv)
{
    char local_time_str[128];
    char *p = NULL;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    p = get_local_time(local_time_str, sizeof(local_time_str), &tv);
    printf("Get local time: \n%s\n", p);

    return 0;
}

点击并拖拽以移动

编译代码,输入:

gcc -o time_string_format time_string_format.c

点击并拖拽以移动

测试结果如下:

img点击并拖拽以移动编辑

上文的示例代码中,给出了好几种打印时间戳格式的示例,笔者只演示了其他的一种,其他的几种,有待读者亲自去验证。验证的过程中,如果有发现什么问题,可随时与我联系。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。