一、structtm 概述
structtm是C/C++語(yǔ)言中的一個(gè)結(jié)構(gòu)體,其定義如下:
struct tm { int tm_sec; // 秒 int tm_min; // 分鐘 int tm_hour; // 小時(shí) int tm_mday; // 月的日期(1-31) int tm_mon; // 月(0-11) int tm_year; // 自 1900 起的年數(shù) int tm_wday; // 星期(0-6,周日為 0) int tm_yday; // 自年初以來(lái)的天數(shù)(0-365) int tm_isdst; // 夏令時(shí)標(biāo)識(shí)符(小于 0 表示沒有夏令時(shí);等于 0 表示不知道;大于 0 表示夏令時(shí)) };
structtm可用于獲取和處理日期和時(shí)間,并支持轉(zhuǎn)換為時(shí)間戳。其提供了一種用于表示和處理日期和時(shí)間的標(biāo)準(zhǔn)方式,可用于計(jì)算日期和時(shí)間的差異, 在文件操作中記錄文件的最后修改時(shí)間, 等等。
二、獲取系統(tǒng)當(dāng)前日期和時(shí)間
獲取系統(tǒng)當(dāng)前日期和時(shí)間是調(diào)用structtm的一個(gè)主要用途,可通過(guò)time函數(shù)獲得1970年至今的秒數(shù),再通過(guò)localtime函數(shù)轉(zhuǎn)換成本地時(shí)間。示例代碼如下:
#include#include int main () { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); printf ( "當(dāng)前的本地時(shí)間為: %s", asctime (timeinfo) ); return 0; }
三、格式化輸出時(shí)間
structtm提供了豐富的輸出方法,可根據(jù)需要進(jìn)行選擇和組裝,同時(shí)也可自定義。示例代碼如下:
#include#include int main () { time_t rawtime; struct tm * timeinfo; char buffer [80]; time ( &rawtime ); timeinfo = localtime ( &rawtime ); strftime (buffer,80,"%Y-%m-%d %H:%M:%S",timeinfo); printf ( "格式化后的本地時(shí)間為: %s\n", buffer ); return 0; }
四、時(shí)間戳的轉(zhuǎn)換
結(jié)構(gòu)體tm提供了兩個(gè)函數(shù):mktime和gmtime,用于將時(shí)間戳轉(zhuǎn)換為本地時(shí)間和GMT標(biāo)準(zhǔn)時(shí)間。示例代碼如下:
#include#include int main () { time_t rawtime; struct tm * ptm; time ( &rawtime ); ptm = gmtime ( &rawtime ); printf ( "GMT時(shí)間: %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec ); ptm = localtime ( &rawtime ); printf ( "本地時(shí)間: %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec ); return 0; }
五、計(jì)算日期和時(shí)間的差異
使用mktime函數(shù)可將時(shí)間轉(zhuǎn)換為秒數(shù),從而可以進(jìn)行日期和時(shí)間的計(jì)算。示例代碼如下:
#include#include int main () { time_t rawtime; struct tm * timeinfo; double seconds; time ( &rawtime ); timeinfo = localtime ( &rawtime ); timeinfo->tm_mday += 30; //加上30天 seconds = difftime(mktime(timeinfo),rawtime); printf ( "一月后的日期: %s", asctime (timeinfo) ); printf ( "一月后與當(dāng)前時(shí)間的時(shí)間差為 %.f 秒。", seconds); return 0; }
六、總結(jié)
structtm結(jié)構(gòu)體提供了一種用于表示和處理日期和時(shí)間的標(biāo)準(zhǔn)方式,可方便地獲取和處理當(dāng)前時(shí)間、進(jìn)行日期和時(shí)間的計(jì)算、格式化輸出等操作。需要提醒的是,由于C/C++中使用time_t類型表示時(shí)間戳?xí)r的存儲(chǔ)溢出問題,只能表示到2038年1月19日03:14:07的時(shí)間, 因此在進(jìn)行時(shí)間計(jì)算時(shí)需要特別注意。