c++中的时间处理(2)time.h库及几个time相关的函数

文章介绍了C语言中的time.h库,包括time_t、clock_t和structtm数据类型,以及clock、time、ctime、asctime、localtime、gmtime、mktime、strftime、difftime等函数的用途和示例代码,展示了如何进行程序计时、获取和转换时间戳以及处理本地和UTC时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于time.h,有人总结了这么3句话:

(1)time_t:表示距离 UTC 时间 1970-01-01 00:00:00 的秒数。也叫做日历时,类型是  long
(2)clock_t: 只用于程序计时,貌似其他的没它什么事。
(3)struct tm:通常用于存储本地时。

其中的常用函数:

(1)clock:     获取程序开始执行后占用的处理器时间,返回值clock_t。
(2)time:     获取当前系统时间(UTC时间)的time_t值。
(3)ctime:    将time_t值转换为表示本地时间的字符串。
(4)asctime:  将struct tm转换为字符串形式。
(5)localtime:将time_t转换为表示本地时间的strunct tm结构。
(6)gmttime:  将time_t值转换为表示GMT时间的字符串。
(7)mktime:   将表示本地时间的struct tm转换为time_t。
(8)strftime: 自定义把结构体tm的日期与时间信息转换为制定的格式。
(9)difftime: 得到两个日历时之间的差值。

1、clock

例子:

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

// 定义记录开始和结束时间的变量
clock_t start, stop;

// 记录函数运行时间, 单位为秒
double duration;

int main(){

    start=clock();

    MyFunction();//要进行计时的目标函数.
    
    // 记录自 main() 函数被执行开始到本次 clock() 被调用一共走过了多少个 ticks.
    stop=clock();
    
    // 将时钟打点数转换成秒数
    duration=((double)(stop-start))/CLOCKS_PER_SEC;

    return 0;
}

2、time

1970-01-01 00:00:00 +0000 (UTC).)到现在的时间值,用秒表示。

常见用法:

time_t time_seconds = time(0);

3、ctime

ctime()用来把时间数值转换成:Tue Jul 11 21:22:42 2023? 这种格式的字符串。
ctime()的函数原型如下:

char *ctime(const time_t *timep);

跟ctime()还是功能类似的函数还有下面2个(类似localtime有localtime_r, localtime_s):

char *ctime_r(const time_t *timep, char *buf);
errno_t ctime_s(char *buf, rsize_t bufsz, const time_t* timer);

举例:

#include <stdio.h>
#include <time.h>
#include <string.h>

int main()
{
	time_t now = time(0);
	printf("%s\n", ctime(&now));
	
	char buf[32];
	memset(buf, 0, sizeof(buf));
	ctime_r(&now, buf);
	printf("%s\n", buf);
}

4、asctime

函数原型:

char* asctime(struct tm * ptr)

举例:

#include <stdio.h>
#include <string.h>
#include <time.h>

int main()
{
	struct tm t;
	char str[80];
	t.tm_sec = 1;
	t.tm_min = 3;
	t.tm_hour = 7;
	t.tm_mday = 22;
	t.tm_mon = 11;
	t.tm_year = 56;
	t.tm_wday = 4;
	t.tm_yday = 0;
	t.tm_isdst = 0;
	strcpy(str, asctime(&t));
	printf("%s", str);
	
	return 0;
}

5、localtime(前面的文章详细讲述了localtime, localtime_r, localtime_s)

6、gmtime

gmtime的用法与localtime是一样的,两者不同之处在于,gmtime的话是UTC时间,而localtime的话是本地时间。

gmtime的函数原型:

struct tm *gmtime(const time_t *timep);
struct tm *gmtime_r(const time_t *timep, struct tm *result);

举例:

#include <stdio.h>
#include <time.h>
 
int main()
{
    time_t time_seconds = time(0);
    struct tm now_time;
    localtime_r(&time_seconds, &now_time);
 
    printf("%d-%d-%d %d:%d:%d\n", now_time.tm_year + 1900, now_time.tm_mon + 1,
        now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);
	
	gmtime_r(&time_seconds, &now_time);
    printf("%d-%d-%d %d:%d:%d\n", now_time.tm_year + 1900, now_time.tm_mon + 1,
        now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);	
}

结果:

可以看到,gmttime返回的时间比localtime迟8个小时。

7、mktime

localtime, gmtime把time_t转成tm,mktime的作用刚好相反,把tm转成time_t。

mktime的函数原型:

time_t mktime(struct tm *tm);

举例:

time_t t = time(0);
struct tm p;
localtime_s(&p, &t);

printf("本地时间:%d年%d月%d日 %d:%d:%d\n",
	p.tm_year + 1900, p.tm_mon + 1, p.tm_mday,
	p.tm_hour, p.tm_min, p.tm_sec);

time_t mkt = -1;
mkt = mktime(&p);
if (-1 == mkt){
	perror("mktime");
}else{
	printf("%ld second\n", mkt);
}

 8、strftime

用来格式化输出时间,比如按:"%Y%m%d %H:%M:%S" 格式输出,函数原型如下:

size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);

举例:

char buf[32];
memset(buf, 0, sizeof(buf));
strftime(buf, sizeof(buf), "%y-%m-%d, %H:%M:%S", &p);
printf("%s\n", buf);

9、difftime

函数原型:

double difftime(time_t time2, time_t time1);

举例:

time_t first, second;

first = time(0);
Sleep(5000);
second = time(0);

std::cout << std::to_string(difftime(second, first)) << std::endl;

return 0;

10、gettimeofday

gettimeofday的话可以获得微秒以及时区以及夏令时等信息。记得它要包含有 #include <sys/time.h> 这个头文件的时候才可以用struct timeval 和struct timezone这两个类型。

举例:

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

int main()
{
	struct timeval tv = {0};
	struct timezone tz = {0} ;

	int ret = -1;
	ret = gettimeofday(&tv,&tz);
	if (-1 == ret )
	{
		perror("gettimeofday");
		return -1;
	}
	printf("U-SECOND = %ld\n",tv.tv_usec);
	printf("TIMEZONE = %d\n",tz.tz_minuteswest);
	printf("TIMEZONE = %d\n",tz.tz_dsttime);
}

参考:

(1)C++ time.h 库详解

(2)struct tm 和 time_t 时间和日期的使用方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值