美文网首页
c语言中的时间戳和时间格式

c语言中的时间戳和时间格式

作者: jolanxiao | 来源:发表于2016-08-12 21:47 被阅读0次

    0、读取系统毫秒级时间

    long getCurrentTime()

    {

    struct timeval tv;

    gettimeofday(&tv,NULL);

    return tv.tv_sec * 1000 + tv.tv_usec / 1000;

    }

    1、时间戳(秒级)

         在Linux系统中,时间戳是一个绝对值,表示距离时间(1970-1-1, 00:00:00)的秒数。在C\C++ 语言中,用数据类型time_t 表示时间戳,time_t 本质上是一个long int。获取当前时间的时间戳代码如下所示:

    #include

    #include

    int main(int argc, const char * argv[])

    {

    time_t now;

    time(&now);

    printf("now:%ld",now);

    }

    上面程序打印出的数据为“now:1470918308” ;1470918308表示当前时间距离格林威治时间的秒数;在shell终端下命令 "date -d @1470918308 " 打印出这个时间戳的日期格式为Thu Aug 11 20:22:47 CST 2016。

    2、如何将时间戳转换成特定的时间格式

          经常碰到的一个问题是将一个时间戳显示成指定的显示格式,比如讲上面的时间显示为2016-8-11。C/C++ 语言中,和时间操作相关的关键数据结构是struc tm,其定义如下:

    struct tm {

    int tm_sec;        /* seconds  0-59*/

    int tm_min;        /* minutes 0-59*/

    int tm_hour;        /* hours 0-23*/

    int tm_mday;        /* day of the month 1-31*/

    int tm_mon;        /* month 0-11*/

    int tm_year;        /* year *距离1990的年数/

    int tm_wday;        /* day of the week 0-6*/

    int tm_yday;        /* day in the year 0-365*/

    int tm_isdst;      /* daylight saving time */

    };

          在将时间戳表示成指定格式前,我们需要将时间戳转换成tm数据结构。C/C++提供了俩个函数struct tm *gmtime(const time_t *timep) 和struct tm *localtime(const time_t *timep); 其中gtime转换后的tm是基于时区0的,而localtime转换后的是基于当地时区【中国为时区8】;因为同一时间戳在不同地区的表示时间是不一样的【因为时区不一样】。我们便可利用经过localtime转换后的tm展示当前时间了,tim_mo+1、tm_year+1990后才是我们想要看到的时间。我们也可以利用接口 size_t strftime(char *s, size_t max, const char *format,const struct tm *tm) 来定制我们的时间格式。

    #include<stdio.h>

    #include<time.h>

    int main(int argc, const char * argv[])

    {

    time_t t;

    time(&t);

    struct tm *tmp_time = localtime(&t);

    char s[100];

    strftime(s, sizeof(s), "%04Y%02m%02d %H:%M:%S", tmp_time);

    printf("%d: %s\n", (int)t, s);

    return 0;

    }

    上面程序输出的数据为:1470919776: 20160811 20:49:36。因此利用strftime我们可以随意定制化显示时间。

    3、如何将时间格式转换时间戳

          有时候我们并不是想得到当前时间戳(time(&t)),而是希望将特定时间格式转换成时间戳,比如计算2016/8/13的时间戳是多少。C/C++提供char *strptime(const char *s, const char *format, struct tm *tm);将时间格式字符串S按指定格式foramt解析成tm; 再用time_t mktime(struct tm *tm)函数将tm生成时间戳。例如程序打印2016/08/13的时间戳。

    #include

    #include

    int main(int argc, const char * argv[])

    {

    struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));

    strptime("2016/08/13/06/12","%Y/%m/%d/%H/%M",tmp_time); //按当地时区将2016/08/13/06/12解析成tmp_time

    time_t t = mktime(tmp_time);//按当地时区解析tmp_time

    printf("%ld\n",t);

    free(tmp_time);

    }

    相关文章

      网友评论

          本文标题:c语言中的时间戳和时间格式

          本文链接:https://www.haomeiwen.com/subject/zjessttx.html