C语言时间函数

gettimeofday()

1.定义:

在C语言中可以使用函数gettimeofday()函数来得到精确时间。它的精度可以达到微妙,是C标准库的函数。

2.函数原型:


#include<sys/time.h>
int gettimeofday(struct  timeval*tv,struct  timezone *tz )

3.说明:

gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中

4.结构体:

1.timeval 结构体定义:


struct  timeval{
    long  tv_sec;  /*秒*/
    long  tv_usec; /*微妙*/
};

2. timezone 结构定义:


struct  timezone{
    int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
    int tz_dsttime;    /*type of DST correction*/
}

在gettimeofday()函数中tv或者tz都可以为空。如果为空则就不返回其对应的结构体。

函数执行成功后返回0,失败后返回-1,错误代码存于errno中。

3.使用方法:

它获得的时间精确到微秒(1e-6 s)量级。在一段代码前后分别使用gettimeofday可以计算代码执行时间:


#include <sys/time.h>
 
struct timeval start,end;  
//timezone 参数若不使用则传入NULL即可.
gettimeofday(&start, NULL );  
//…executing…  
gettimeofday(&end, NULL );  
double timeuse = ( end.tv_sec - start.tv_sec ) + (end.tv_usec - start.tv_usec)/1000000.0;  
printf("time=%f\n",timeuse);  

获取当前时间:

#include <sys/time.h>

struct timeval now_time;
struct tm *p;
gettimeofday(&now_time, NULL);
p = gmtime(&now_time.tv_sec);        //借助强转,实际上now_time.tv_sec就是unix时间戳
printf("%d-%02d-%02d %02dh:%02dm:%02ds:%ldus\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec, now_time.tv_usec);

time()

几个时间概念:

1:Coordinated Universal Time(UTC):

协调世界时,又称世界标准时间,也即格林威治标准时间(Greenwich Mean Time,GMT),中国内地的时间与UTC得时差为+8,也即UTC+8,美国为UTC-5。

2:Calendar Time:

日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。标准时间点对不同编译器可能会不同,但对一个编译系统来说,标准时间是不变的。一般是表示距离UTC时间 1970-01-01 00:00:00的秒数。

3:epoch:

时间点。在标准c/c++中是一个整数,用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

4:clock tick:

时钟计时单元(而不叫做时钟滴答次数),一个时钟计时单元的时间长短是由cpu控制的,一个clock tick不是cpu的一个时钟周期,而是c/c++的一个基本计时单位。

time.h的定义

time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。

4个变量

size_t

是无符号整数类型,它是 sizeof 关键字的结果。

clock_t

这是一个适合存储处理器时间的类型,类型为unsigned long

time_t

这是一个适合存储日历时间类型。

struct tm

这是一个用来保存时间和日期的结构。

tm 结构的定义如下:


struct tm 
{
   int tm_sec;         /* 秒,范围从 0 到 59      */
   int tm_min;         /* 分,范围从 0 到 59      */
   int tm_hour;        /* 小时,范围从 0 到 23     */
   int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
   int tm_mon;         /* 月,范围从 0 到 11(注意)  */
   int tm_year;        /* 自 1900 年起的年数      */
   int tm_wday;        /* 一周中的第几天,范围从 0 到 6 */
   int tm_yday;        /* 一年中的第几天,范围从 0 到 365   */
   int tm_isdst;       /* 夏令时               */
};

两个宏

NULL

这个宏是一个空指针常量的值。

CLOCKS_PER_SEC

这个宏表示每秒的处理器时钟个数。用于将clock()函数的结果转化为以秒为单位的量,这个量的具体值是与操作系统相关的,通常为1000。

库函数

1.clock函数

函数原型:   clock_t clock(void)
函数返回:返回clock函数执行起(一般为程序的开头),处理器时钟所使用的时间。
函数功能:用来计算程序或程序的某一段的执行时间。

#include<stdio.h>
#include<time.h>
 
int main()
{
    clock_t start_t,finish_t;
    double total_t = 0;
    int i = 0;
    start_t = clock();
    for(;i<100000;++i)
    {
        //do someting;
    }
    finish_t = clock();
    total_t = (double)(finish_t - start_t) / CLOCKS_PER_SEC;//将时间转换为秒
 
    printf("CPU 占用的总时间:%f\n", total_t);
    return 0;
}
2.time函数

函数原型: time_t time(time_t *timer)
参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数),
        timer=时间数值时,用于设置日历时间,time_t是一个unsigned long类型。
        如果 timer不为空,则返回值也存储在变量 timer中。
函数功能: 得到当前日历时间或者设置日历时间
函数返回: 当前日历时间

#include <stdio.h>
#include <time.h>
 
int main ()
{
  time_t seconds;
 
  seconds = time(NULL);
  printf("自 1970-01-01 起的小时数 = %ld\n", seconds/3600);
  
  return(0);
}
3.asctime函数

函数原型: char* asctime(struct tm * ptr)
函数功能:将结构struct tm * ptr所表示的时间以字符串表示
函数返回: 返回的时间字符串格式为:星期,月,日,小时:分:秒,年
参数说明: 结构指针ptr应通过函数localtime()或gmtime()得到

#include <stdio.h>
#include <time.h>
 
int main()
{
   struct tm t;//更多情况下是通过localtime函数及gmtime函数获得tm结构
 
   t.tm_sec    = 10;
   t.tm_min    = 10;
   t.tm_hour   = 6;
   t.tm_mday   = 25;
   t.tm_mon    = 2;
   t.tm_year   = 89;
   t.tm_wday   = 6;
 
   printf("%s\n",asctime(&t));
 
   return(0);
}
4:localtime函数

函数原型: struct tm *localtime(const time_t *timer)
函数功能: 使用 timer 的值来填充 tm 结构。timer 的值被分解为 tm 结构,并用本地时区表示。
函数返回: 以tm结构表达的时间

#include <stdio.h>
#include <time.h>
 
int main ()
{
   time_t timer;
   struct tm *Now;
 
   time( &timer );
   Now = localtime( &timer );
   printf("当前的本地时间和日期:%s", asctime(Now));
 
   return(0);
}
5:ctime函数

函数原型: char *ctime(const time_t * timer)
函数功能: 将日历时间参数timer转换为一个表示本地当前时间的字符串
函数返回: 返回字符串格式:星期,月,日,小时:分:秒,年
参数说明: timer参数应由函数time获得,其等价于 astime( localtime(timer) )

#include <stdio.h>
#include <time.h>
 
int main ()
{
   time_t curtime;
   time(&curtime);
   printf("当前时间 = %s", ctime(&curtime));
 
   return(0);
}
6:difftime函数

函数原型: double difftime(time_t time2, time_t time1)
函数功能: 得到两次机器时间差,单位为秒
函数返回: 时间差,单位为秒
参数说明: time1,time2分别表示两个不同的机器时间,该参数应使用time函数获得

#include <time.h>  
#include <stdio.h>  
int main()  
{  
    time_t first,second;  
    time(&first);  
    sleep(2000);  
    time(&second); 
    printf("The difference is: %f seconds",difftime(second,first));  
 
    return 0;  
}  
7:gmtime函数

函数原型: struct tm *gmtime(time_t *timer)
函数功能: 得到以结构tm表示的时间信息,并用格林威治标准时间表示
函数返回: 以结构tm表示的时间信息指针
参数说明: timer用函数time()得到的时间信息
#include <stdio.h>
#include <time.h>

/*
功能:获取服务器时间戳,并转成标准格式
参数:u32TimeStamp时间戳地址,标准时间格式
返回值:成功0,失败-1
*/

int ps32TimeStamp = 0;
char ps8TimeStandard[64] = {0};
int get_time(int *ps32TimeStamp, char *ps8TimeStandard) {

    memset(ps8TimeStandard, 0, sizeof(ps8TimeStandard));
    
    *ps32TimeStamp = time(NULL);

    time_t time_tmp;
    struct tm *p;
    time(&time_tmp);
    p = gmtime(&time_tmp);

    snprintf(ps8TimeStandard, 20, "%d-%02d-%02d %d:%02d:%02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec);

    // printf("\n%s\n", log_time_buf);
    return 0;
}

#include <stdio.h>
#include <time.h>
 
#define BST (+1)
#define CCT (+8)
 
int main ()
{
 
   time_t rawtime;
   struct tm *info;
 
   time(&rawtime);
   /* 获取 GMT 时间 */
   info = gmtime(&rawtime );
 
   printf("当前的世界时钟:\n");
   printf("伦敦:%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
   printf("中国:%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);
 
   return(0);
}
8:mktime函数

函数原型:time_t mktime(struct tm *timeptr)
函数功能:把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值
函数返回:该函数返回一个 time_t 值,该值对应于以参数传递的日历时间。如果发生错误,则返回 -1 值。

#include <stdio.h>
#include <time.h>
 
int main ()
{
   int ret;
   struct tm info;
   char buffer[80];
 
   info.tm_year = 2001 - 1900;
   info.tm_mon = 7 - 1;
   info.tm_mday = 4;
   info.tm_hour = 0;
   info.tm_min = 0;
   info.tm_sec = 1;
   info.tm_isdst = -1;
 
   ret = mktime(&info);
   if( ret == -1 )
   {
       printf("错误:不能使用 mktime 转换时间。\n");
   }
   else
   {
      strftime(buffer, sizeof(buffer), "%c", &info );
      print(buffer);
   }
 
   return(0);
}
9:strftime函数

函数原型: size_t strftime( char *strDest, size_t  maxsize, const char *format, const struct tm  *timeptr);
函数功能: 根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向 strDest中存放maxsize个字符。
参数说明: 转化结果存在s中,最多maxsize个字符写到s中
函数返回: 该函数返回向strDest指向的字符串中放置的字符数(不包括'\0'),如果字符数多于maxsize,函数返回0.

/*format如下:它们是区分大小写的。 
    %a 星期几的简写 
    %A 星期几的全称 
    %b 月分的简写 
    %B 月份的全称 
    %c 标准的日期的时间串 
    %C 年份的后两位数字 
    %d 十进制表示的每月的第几天 
    %D 月/天/年 
    %e 在两字符域中,十进制表示的每月的第几天 
    %F 年-月-日 
    %g 年份的后两位数字,使用基于周的年 
    %G 年分,使用基于周的年 
    %h 简写的月份名 
    %H 24小时制的小时 
    %I 12小时制的小时 
    %j 十进制表示的每年的第几天 
    %m 十进制表示的月份 
    %M 十时制表示的分钟数 
    %n 新行符 
    %p 本地的AM或PM的等价显示 
    %r 12小时的时间 
    %R 显示小时和分钟:hh:mm 
    %S 十进制的秒数 
    %t 水平制表符 
    %T 显示时分秒:hh:mm:ss 
    %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0) 
    %U 第年的第几周,把星期日做为第一天(值从0到53) 
    %V 每年的第几周,使用基于周的年 
    %w 十进制表示的星期几(值从0到6,星期天为0) 
    %W 每年的第几周,把星期一做为第一天(值从0到53) 
    %x 标准的日期串 
    %X 标准的时间串 
    %y 不带世纪的十进制年份(值从0到99) 
    %Y 带世纪部分的十进制年份 
    %z,%Z 时区名称,如果不能得到时区名称则返回空字符。 
    %% 百分号 
*/  
 
#include <stdio.h>
#include <time.h>
 
int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];
 
   time( &rawtime );
 
   info = localtime( &rawtime );
 
   strftime(buffer,80,"%Y%m%e_%H%M%S", info);//以年月日_时分秒的形式表示当前时间
   printf("%s\n", buffer );
 
   return(0);
}

————————————————

版权声明:本文为CSDN博主「hmxz1024」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:C语言中的time函数总结-CSDN博客

  • 25
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值