日期和时间

引入时间的头文件

#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

接下来我们将刚得到的本地时间转化为格林威治时间

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>

原文地址:https://www.cnblogs.com/qifeng1024/p/12640954.html