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取出一年中的天数