日期和时间
引入时间的头文件
#include <ctime>
这个头文件里面有个结构体
struct tm { int tm_sec; //秒,正常范围0 ~59,但是允许到61 int tm_min; //分 范围 0~59 int tm_hour; //小时 0~23 int tm_mday; //一月中的第几天 int tm_mon; //月 0~11 int tm_year; //自1900年起的年数 int tm_wday; //一周中的第几天 int tm_yday; //一年中的第几天 int tm_isdst; //夏令时 }
还有几个数据类型
clock_t Clock type (type ) size_t Unsigned integral type (type ) time_t Time type (type ) struct tm Time structure (type )
成员函数如下:
函数原型如下:
char *ctime(const time_t *timep); char *asctime(const struct tm *tm); struct tm *gmtime(const time_t *timep); struct tm *localtime(const time_t *timep); double difftime(time_t time1, time_t time0); time_t mktime(struct tm *tm); clock_t clock(void); size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);
int main(int argc, char const *argv[]) { time_t now = time(0); cout<< now << endl; }
输出
1586137485
这串数字表示从1970年1月1日到现在 经过了多少秒
我们把这个秒转化为能看懂的时间
int main(int argc, char const *argv[]) { time_t now = time(0); cout<< now << endl; char *dt = ctime(&now); cout <<"local time is :"<< dt <<endl; }
输出:
1586137485 local time is :Mon Apr 6 09:44:45 2020
给 ctime 传入 time_t 类型的参数,则返回一个字符串表示时间
字符串格式:
day month year hours:minutes:seconds year\n\0
接下来我们将刚得到的本地时间转化为格林威治时间
int main(int argc, char const *argv[]) { time_t now = time(0); cout<< now << endl; tm *gmtm = gmtime(&now); char *dt = asctime(gmtm); cout << "utc time :"<<dt<<endl; }
得到输出如下
1586138755 utc time :Mon Apr 6 02:05:55 2020
gmtime() 将time()得到的秒数作为参数传入该函数 ,得到utc时间的结构体(就是前文我们介绍过的结构体 tm)
asctime() 格式转化函数,表示把时间转化为ascii码,而ctime()表示把时间转化为字符串 字符串的格式前文有写。
和ctime()不同的是:asctime()传入的参数是 tm 结构体
ctime()传入的参数是 time_t 类型的秒数
同样的方法我们看一下本地时间函数 localtime()
int main(int argc, char const *argv[]) { time_t now = time(0); cout<< now << endl; tm *gmtm = gmtime(&now); char *dt = asctime(gmtm); cout << "utc time :"<<dt<<endl; gmtm = localtime(&now); dt = asctime(gmtm); cout << "local time :"<<dt<<endl; }
输出如下:
1586139439 utc time :Mon Apr 6 02:17:19 2020 local time :Mon Apr 6 10:17:19 2020
得到的分别是世界时间(格林威治时间)和北京时间,中间相差8个小时。
因为time()返回的是 0 时区的时间,而我们国家是东八区 自然相差8个小时。
接下来我们把上面结构体的数据都打印出来
int main(int argc, char const *argv[]) { time_t now = time(0); cout<< "second from 1970.1.1 :"<<now << endl; tm *gmtm = localtime(&now); char *dt = asctime(gmtm); cout << "local time :"<<dt<<endl; cout<<"tm_sec "<<gmtm->tm_sec<<endl; cout<<"tm_min "<<gmtm->tm_min<<endl; cout<<"tm_hour "<<gmtm->tm_hour<<endl; cout<<"tm_mday "<<gmtm->tm_mday<<endl; cout<<"tm_mon "<<gmtm->tm_mon<<endl; cout<<"tm_year "<<gmtm->tm_year<<endl; cout<<"tm_wday "<<gmtm->tm_wday<<endl; cout<<"tm_yday "<<gmtm->tm_yday<<endl; cout<<"tm_isdst "<<gmtm->tm_isdst<<endl; }
输出如下:
second from 1970.1.1 :1586140107 local time :Mon Apr 6 10:28:27 2020 tm_sec 27 秒 tm_min 28 分 tm_hour 10 时 tm_mday 6 几号 tm_mon 3 几月 tm_year 120 年 tm_wday 1 星期 tm_yday 96 本年第几天 tm_isdst 0
上面汉字是我后加上去的
可以看出有几个数据不对,其中tm_mon 这个月份是从0开始,所以程序中的3表示4月,tm_year表示从1900年开始,所以1900+120 = 2020
再看一下时间比较函数 difftime()
int main(int argc, char const *argv[]) { time_t start,end; double dif; time(&start); sleep(5); time(&end); dif = difftime(end,start); cout<<dif<<endl; }
取两次时间的秒数,一次是sleep之前,一次是sleep之后,将这两个时间传入函数,得出时间差
注意如果是linux运行 sleep头文件是 #include <unistd.h>