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