----- 时间 -----


 数据类型 
#include <ctime>
    
time_t a;  //time_t,用来存储时间戳
clock_t a;  //clock_t,用来存储自程序启动以来经过的时钟周期数
struct tm a;  //存储日期时间结构
    

 函数 
#include <ctime>
    
time_t varName = time(time_t *time);
    //返回当前时间戳
    time(&a);
        //传入时间戳地址,对 a 进行赋值
    time_t a = time(NULL); //合并写法,传入空地址,并赋值给 a
    
char *varName = ctime(time_t * timestamp);
    //返回可读性的时间
    char *nowTime = ctime(&a);
        //将 a 转换为可读性时间,C 使用 char
    string nowTime = ctime(&a);
        //将 a 转换为可读性时间,C++ 使用 string
    
clock_t varName = clock();
    //返回程序执行过程中两个时间的时间差
    clock_t before = clock();
        //记录某一开始时间
    .........
        //程序执行过程
    clock_t diff = clock() - before;
        //diff 即为耗时时间,时间单位取决于计算机
    float diff = clock() - before;
    float sec = diff / CLOCKS_PER_SEC;
        //通过宏常量 CLOCKS_PER_SEC 将耗时转换为秒,转换前需保证 diff 为浮点数
    
double varName = difftime(time_t end, time_t start);
    //返回两个时间戳之间的秒数
    double difftime(b, a);  //不需要传入地址,因为不用修改变量
    
struct tm *varName = gmtime(time_t *timestamp);
    //将时间戳转换为表示 GMT 时区时间的 tm 结构体指针
    gmtime(&a);  
    
struct tm *varName = localtime(time_t *timestamp);
    //将时间戳转换为表示计算机本地时区时间的 tm 结构体指针
    localtime(&a);  
    
char *varName = asctime(const struct tm * time);
    //将 tm 结构体中的时间转换为 C 风格字符串表示,固定格式
    asctime(a);  
        //WWW MMM DD HH:mm:ss YYYY(例如:"Sun Dec 17 21:34:26 2023")
    
int varName = strftime(char *destination, size_t size, const char *format, const struct tm *datetime);
    //将 tm 结构体中的时间转换为 C 风格字符串表示,可自定义格式
    struct tm *date;  //声明结构体
    date = localtime(&a);  //转换时间戳为结构体
    char b[30];  //存放格式化后的时间字符串
    strftime(b, 30, "%I:%M:%S %p", date);
    cout << "时间:" << b;
        /*---------- 格式化字符串 ----------*/
        https://www.w3school.com.cn/cpp/ref_ctime_strftime.asp
        %a    星期简写                                                             Fri
        %A    星期全称                                                             Friday
        %b    月份简写                                                             Dec
        %B    月份全称                                                             December
        %d    月份中的天数,带前导零                                 09
        %D    日期表示形式,等效于 %m/%d/%y              12/17/23
        %e    月份中的天数,带前导空格                              9
        %F    日期表示形式,等效于 %Y-%m-%d                 2023-12-17
        %T    24 小时制时间格式,等效于 %H:%M:%S       14:30:01
        %G    星期简写  Fri
        ......
    
time_t varName = mktime(struct tm *time);
    //将 tm 结构体转换为时间戳
    struct tm date;  //声明结构体
    date.tm_year = 2026 - 1900;
    date.tm_mon = 1 - 1;
    date.tm_mday = 12;
    date.tm_hour = 12;
    date.tm_min = 12;
    date.tm_sec = 12;
    date.tm_isdst = -1;
    time_t now = mktime(&date);  
    cout << "自定义时间的时间戳:" << now;

 示例 
#include <ctime>
    
int main() {
    // 存储时间
    time_t a; //声明 time_t 类型的 a,用来存储时间
    time(&a); //time() 函数通过地址,将时间赋值给变量 a,因为函数不会修改变量本身,所以需传入地址
    time_t a = time(NULL); //合并写法,传入空地址,并赋值给 a
    
    // 显示时间
    string nowTime = ctime(&a); 
        //ctime() 函数通过 a 的地址,来显示可读性时间,返回字符串,C++ 使用 string 类型
    char* nowTime = ctime(&a); 
        //C 使用 char* 指针
    
    // 打印时间
    cout << nowTime << endl;   //C++ 
    printf("%s\n", nowTime);   //C 
    
    // 自定义格式化
    struct tm *date = localtime(&a);   //返回本地时间的 tm 结构体
    char nowTime[50];   //存储格式化后的时间字符串
    strftime(nowTime, 50, "%I:%M:%S %p", date);   //返回本地时间的 tm 结构体
    printf("%s\n", nowTime);
}