C++ <ctime>(time.h)库笔记 以及简便计算日期差等


参考查阅文档API : http://www.cplusplus.com/reference/ctime/


首先讲一下这个头文件主要的两个变量类型,time_t 和 struct tm


time_t 这个是个算术类型(arithmetic type) 查看一下源码 就是 __int64(和 long long 型范围一样,不同之处点这里)

在这里就是 秒.


struct tm这个结构体有9个成员

MemberTypeMeaningRange
tm_secintseconds after the minute0-60*
tm_minintminutes after the hour0-59
tm_hourinthours since midnight0-23
tm_mdayintday of the month1-31
tm_monintmonths since January0-11
tm_yearintyears since 1900
tm_wdayintdays since Sunday0-6
tm_ydayintdays since January 10-365
tm_isdstintDaylight Saving Time flag

第一个 tm_sec 一般来说范围是(0~59),但为了适应一些系统有闰秒这鬼东西,范围就扩大了.(考虑真细= =)

最后面那个 tm_isdst是作为夏令时的flag,至于什么夏令时,我也不太懂是什么鬼,自行百度,这里不考虑他.

注意 tm_mday是从1开始,如果输入0相当于前一天.

需要注意 tm_mon 从相对一月开始计算,例如:要设置为11月,那就是 tm_mon = 11 - 1;

需要特别注意的是 tm_year这个是从1900年作为起始时间的,例如:要设置时间为2016,那就是 tm_year = 2016 - 1900;


下面讲一下各个函数


time

time_t time (time_t* timer);//获取当前时间,然后赋值给指针变量 timer

//注意这里的时间是现在时间减去1900年1月1日0时0分0秒的时间

time_t timer;
//下面两个获取当前时间赋值给timer的方法,效果是一样的
time(&timer); 
timer = time(NULL);


ctime

char* ctime (const time_t * timer);//将time_t转换成字符串

字符串的格式为: Www Mmm dd hh:mm:ss yyyy

    星期      月     日  时   分  秒  年

cout << ctime(&timer);//timer = time(NULL);


asctime

char* asctime (const struct tm * timeptr);//将tm结构体转换成字符串

返回值字符串格式跟上面ctime一样


mktime

表示范围从1900年1月1日到3000年1月1日(自己测试结果)

time_t mktime (struct tm * timeptr);//将tm结构体转换成time_t

还会根据结构体的年月日 修改成员 tm_wday 和 tm_yday, (原来的这两个成员变量会被忽视)

struct tm t1 = { 0 };//初始化结构体  
t1.tm_year = 2016 - 1900;//年份设置为2016年  
t1.tm_mon = 10;//月份设置为11月  
t1.tm_mday = 21;//记得tm_mday要设置  否则0就是前一天  
mktime(&t1);//格式化结构体,返回时间 秒为单位  


执行完上面的语句断点查看t1结构体变量

根据tm_mday,tm_mon,tm_year,

mktime函数会修改tm_wday(1为星期一),tm_yday(325为这一年的第326天,325这个值是相对一月一日的)


localtime

struct tm * localtime (const time_t * timer);//将time_t转换成结构体


gmtime

struct tm * gmtime (const time_t * timer);//这个和上面稍微不一样,

//会根据UTC(协调世界时Coordinated Universal Time)做修改,点这里


strftime

size_t strftime (char* ptr, size_t maxsize, const char* format, const struct tm* timeptr );

//这个叼,可以根据各种格式输出自己想要的时间,太多,自己看


clock

clock_t clock (void);//获取当前程序运行时间,可以用来计算一些算法需要消耗的时间

clock_t t;/long型
t = clock();	//算法开始时间
{a();}//一些什么算法之类的
t = clock() - t;//算法从开始到结束消耗的的时间



difftime

double difftime (time_t end, time_t beginning);//计算两个时间的时间差 end - beginning



那么介绍函数们后,来讲一下具体问题的用途吧


计算日期差

比方说,我想算一下现在(2016.11.21)到明年高考(2017.6.7)还有多少天

#include<iostream>  
#include <ctime>

using namespace std;

int main() {
	struct tm t1 = { 0 };
	struct tm t2 = { 0 };
	double seconds;

	t1.tm_year = 2016 - 1900; t1.tm_mon = 10; t1.tm_mday = 21;//现在时间2016,11,21
	t2.tm_year = 2017 - 1900; t2.tm_mon = 5; t2.tm_mday = 7;//高考时间2017,6,7

	seconds = difftime(mktime(&t2), mktime(&t1));//转换结构体为time_t,利用difftime,计算时间差

	cout << seconds / 86400 << endl;//最后输出时间,因为一天有86400秒(60*60*24)
	system("pause");
	return 0;
}
输出结果 : 198 


*计算日期差更简便的方法就是用excel了,而且计算结果范围比上面这个大.

excel的日期计算结果范围是1900年1月1日到9999年12月31日.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值