C/C++时间

1、获取系统时间(加上头文件time.h)

①获取秒数time_t

时间是一个从1970年开始计算的数,用time_t类型定义获取的时间(不是用int,但是time_t类型实质是一个整数类型

time_t now=time(NULL)

用于统计程序运行过程中消耗的秒数,如果程序执行时间为ms级,则可以通过for循环执行很多次来实现ms级的时间评估

time_t start=time(NULL);
for(int i=0;i<10000;i++)
{
    ...//需要执行的程序
}
time_t end=time(NULL);
int result=(start-end)/10000;

用 time_t记录时间更方便,只用一个整数(占4个字节)就能表达日期和时间信息,因此在保存和传输的时候尽量用time_t,在最终的显示上可以用tm

②获取年月日tm(肉眼无法看出time_t表示的具体日期和时间)

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

int main()
{
    time_t t=time(NULL);
    tm info= *localtime(&t);
    printf("%04d-%02d-%02d %02d:%02d:%02d\n",
            info.tm_year+1900,
            info.tm_mon+1,
            info.tm_mday,
            info.tm_hour,
            info.tm_min,
            info.tm_sec);
    return 0;
}

取结构体中元素的方法,tm中已经定义好元素名称

localtime的返回值是tm*类型

tm_mday月中的第几天,tm_wday周中的第几天,tm_yday年中的第几天,有了上面6个参数值,就能直接推算出tm_wday和tm_yday

③将获取到的年月日转化为秒mktime

tm info;
info.tm_year=2019-1900;
info.tm_mon=4-1;//表示4月
info.tm_mday=10;
info.tm_hour=9;
info.tm_min=0;
info.tm_sec=0;
time_t t=mktime(&info);
if (t<0)
{
    ...//转换失败
}

输入值不正确或者不完整,则mktime返回-1,表示转化失败

2、日期格式的转化

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


int main()
{	
	const char* src = "2015-03-18"; // source
	char dst[128]; // destination

	int year = 0;
	int month = 0;
	int day = 0;

	int ret = sscanf(src, "%d-%d-%d", &year, &month, &day);
	if(ret == 3)
	{
		sprintf(dst, "%d/%d/%d", year, month, day);
	}

	return 0;
} 

从一个具有格式的字符串中提取固定字段,返回值表示成功提取的字段个数,通过定义int变量来存储具体值

时间字符串的定义为const char*,从而可以对指针字符串按照指定格式进行取地址操作

sscanf中是取出的地址,sprintf是直接取出的变量名

 

3、天数计算

下面方法是直接在main中完成的 

#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;  
} 

如果在子函数中完成,则需要把年月日字段逐一取出(VS中验证)

 

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

class AfDate
{
public:
	int year, month, day;
	
	AfDate()
	{
		time_t now = time(NULL);
		tm info = *  localtime(&now);
		year = info.tm_year + 1900;
		month = info.tm_mon + 1;
		day = info.tm_mday;
	}
	AfDate(int y, int m, int d)
		:year(y), month(m), day(d)
	{
	}

	int daysTo(const AfDate& other)
	{
		tm info1 ={0};
		info1.tm_year = year - 1900;
		info1.tm_mon = month - 1;
		info1.tm_mday = day;
		time_t t1 = mktime(&info1);

		tm info2 ={0};
		info2.tm_year = other.year - 1900;
		info2.tm_mon = other.month - 1;
		info2.tm_mday = other.day;
		time_t t2 = mktime(&info2);

		int delta = (int) (t2 - t1);
		int days = delta / (24 * 3600);
		return days;
	}

};
int main()
{
	AfDate today;
	AfDate birthday(1982, 1, 1);
	int days = birthday.daysTo(today);

	return 0;
}

 

4、星期计算

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

int main()
{
	// 1982年3月1日
	tm info = { 0 };
	info.tm_year = 2015 - 1900;
	info.tm_mon  = 4 - 1;
	info.tm_mday = 25;
	
	mktime(&info);
	printf("Weekday: %d \n", info.tm_wday);

	return 0; 
}

调用mktime函数会根据年月日计算好tm_wday和tm_yday并填到info参数中。

定义tm结构体,直接取0,在逐一给结构体中固定元素赋值,除了去一周中的天数,还可以通过.tm_yday取出一年中的天数

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值