时间函数详解

本文详细介绍了C语言编程中与时间相关的概念,如UTC、日历时间、Unix时间戳等,并梳理了time.h头文件中的关键结构体(struct timeval、struct tm、struct timezone)和常用函数(time、gmtime、localtime、asctime、ctime、mktime、clock)的用途及使用示例。这些函数在处理时间转换和计时操作时非常实用。
摘要由CSDN通过智能技术生成

在C语言编程时,我们经常会用到时间函数,一般在time.h中都会有封装好的时间函数,所以我想在这里将其总结记录一下。

一、几种时间概念

1、Coordinated Universal Time(UTC)

协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。世界时是最早的时间标准。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。

2、Calendar Time

日历时间。是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来 说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区, 在同一时刻对同一个标准时间点来说,日历时间都是一样的。

3、Unix时间戳

在计算机中看到的UTC时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳。

4、poch

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

5、clock tick

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

6、Daylight Saving Time(DST)

夏令时,也叫夏时制,又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。1992年起,夏令时暂停实行。

二、 time.h

我们在编程时计算机日志里记录的基本上都是UTC时间(从 1970年01月01日 0:00:00 开始计算秒数。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒),但是我们再查看日志的时候却要换算成当地时间查看,如何查看,便出现了一个简单而使用的工具,就是使用linux/unix命令date来进行本地时间和local时间的转化。 下面介绍一下time.h里面的一些常用的函数与结构体说明。

(一)结构类型

1、struct timeval(保存秒和微秒信息)
struct timeval
{
    long tv_sec; /*秒*/
    long tv_usec; /*微秒*/
};
2、struct tm: (保存时间和日期,存储年月日)
struct tm
{
    int tm_sec;  /*秒,正常范围0-59, 但允许至61*/
    int tm_min;  /*分钟,0-59*/
    int tm_hour; /*小时, 0-23*/
    int tm_mday; /*日,即一个月中的第几天,1-31*/
    int tm_mon;  /*月, 从一月算起,范围从 0 到 11(注意) */  1+p->tm_mon;
    int tm_year;  /*年, 从1900算起,不是直接存储*/  1900+ p->tm_year;
    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
    int tm_isdst; /*夏令时  */
};
3、struct timezone (保存时区信息)
struct timezone {
    int tz_minuteswest;  /*和 格林威治 时间差了多少分钟*/
    int tz_dsttime;  	 /* 夏令时*/
};

(二)常用函数

1、time_t time(time_t *tloc) 【获得日历时间】

头文件: time.h
原型: time_t time(time_t *t);
说明: 计算当前日历时间,并把它编码成 time_t 格式。此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存。
返回值: 成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno 中。

示例:
#include "time.h"
#include "stdio.h"
int main(void)
{
    struct tm *ptr;
    time_t lt;
    lt =time(NULL);
    printf("The Calendar Time now is %d\n",lt);
    return 0;
}

在这里插入图片描述
其中 1657771234 就是我运行程序时的日历时间。即从1970年1月1日0时0分0秒到此时的秒数。

2、gmtime(const time_t *timep) 【将日历时间转化为世界标准时间】

头文件: time.h
原型: struct tm *gmtime(const time_t *timep);
说明: gmtime()将参数timep 所指的time_t 中的日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间。此函数返回的时间日期未经时区转换,是UTC 时间。
返回值: 返回结构tm 代表目前UTC 时间。

示例:
#include <stdio.h>
#include <time.h>

int main() {
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep; 
    struct tm *p;  

    time(&timep);
    p = gmtime(&timep);
    printf("%d/%d/%d ", (p->tm_year+1900), (p->tm_mon+1), p->tm_mday);
    printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
    return 0;
}

在这里插入图片描述

3、localtime(const time_t *timep) 【将日历时间转化为本地时间】

头文件: time.h
原型: struct tm *localtime(const time_t * timep);
说明: localtime()将参数timep 所指的time_t 结构中的日历时间转化为本地时间,然后将结果由结构tm 返回。此函数返回的时间日期已经转换成当地时区。
返回值: 返回结构tm 代表目前的当地时间。

示例
#include <stdio.h>
#include <time.h>

int main() {
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t timep;
    struct tm *p;

    time(&timep);
    p = localtime(&timep); //取得当地时间
    printf("%d/%d/%d ", (p->tm_year+1900), (p->tm_mon+1), p->tm_mday);
    printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
    return 0;
}

在这里插入图片描述

4、asctime(const sturct tm* tm) 【将目前时间转换为以字符串输出】

头文件: time.h
原型: char *asctime(const struct tm * timeptr);
说明: asctime()将参数timeptr 所指的tm 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。即通过tm结构来生成具有固定格式的保存时间信息的字符串。字符串格式为:“Tue Jun 1 18:10:22 2021”
返回值: 返回一字符串表示目前时间日期。

示例:
#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    time(&timep);
    printf("%s", asctime(gmtime(&timep)));
    return 0;
}

在这里插入图片描述

5、ctime(const time_t *timep) 【将日历时间转化为本地时间,再以格式化后的字符串形式输出】

头文件: time.h
原型: char *ctime(const time_t *timep);
说明: ctime()将参数timep 所指的time_t 的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为:“Tue Jun 1 18:10:22 2021”
返回值: 返回一字符串表示目前当地的时间日期。

示例:
#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    time(&timep);
    printf("%s", ctime(&timep));
    return 0;
}

在这里插入图片描述

  • 注意区别:
    asctime()函数只是把tm结构对象中的各个域填到时间字符串的相应位置就行了,而ctime()函数需要先参照本地的时间设置,把日历时间转化为本地时间,然后再生成格式化后的字符串。
6、mktime(struct tm *tm) 【将时间转换成经过的秒数】

头文件: time.h
原型: time_t mktime(strcut tm * timeptr);
说明: mktime()用来将参数timeptr 所指的tm 结构数据转换成从公元1970 年1 月1 日0 时0 分0 秒算起至今的UTC 时间所经过的秒数。此函数要对tm结构的各个成员值进行分析,然后合并成time_t类型的值返回,比较复杂。
返回值: 返回经过的秒数。发生错误时返回-1

示例:
#include <stdio.h>
#include <time.h>

int main() {
    time_t timep;
    struct tm *p;
    time(&timep);
    printf("time():%ld \n", timep);
    p = localtime(&timep);
    timep = mktime(p);
    printf("time()->localtime()->mktime():%ld\n", timep);
    return 0;
}

在这里插入图片描述

7、 clock_t clock(void) 【计时】

头文件: time.h
原型: clock_t clock(void);
说明: 这个函数返回从 “开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数, 在MSDN中称之为挂钟时间(wall-clock)。其中clock_t是用来保存时间的数据类型。为了获取 CPU 所使用的秒数,需要除以 CLOCKS_PER_SEC。在 32 位系统中,CLOCKS_PER_SEC 等于 1000000,该函数大约每 72 分钟会返回相同的值。
返回值: 该函数返回自程序启动起,处理器时钟所使用的时间。如果失败,则返回 -1 值。

实例:
#include <time.h>
#include <stdio.h>
 
int main()
{
   clock_t start_t, end_t;
   double total_t;
   int i;
 
   start_t = clock();
   printf("程序启动,start_t = %ld\n", start_t);
    
   printf("开始一个大循环,start_t = %ld\n", start_t);
   for(i=0; i< 10000000; i++)
   {
   }
   end_t = clock();
   printf("大循环结束,end_t = %ld\n", end_t);
   
   total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
   printf("CPU 占用的总时间:%f\n", total_t  );
   printf("程序退出...\n");
 
   return(0);
}

在这里插入图片描述

三、总结

时间函数在代码编程过程中还是使用非常多的,本文记录一些常用的时间函数解析,以便后续查找与翻阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值