複製鏈接
請複製以下鏈接發送給好友

struct tm

鎖定
在標準C/C++中,我們可通過tm結構來獲得日期和時間,tm結構在time.h中的定義如下:
#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值區間為[0,59] */
int tm_min; /* 分 - 取值區間為[0,59] */
int tm_hour; /* 時 - 取值區間為[0,23] */
int tm_mday; /* 一個月中的日期 - 取值區間為[1,31] */
int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區間為[0,11] */
int tm_year; /* 年份,其值等於實際年份減去1900 */
int tm_wday; /* 星期 – 取值區間為[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; /* 從每年的1月1日開始的天數 – 取值區間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的時候,tm_isdst為0;不瞭解情況時,tm_isdst()為負。
long int tm_gmtoff; /*指定了日期變更線東面時區中UTC東部時區正秒數或UTC西部時區的負秒數*/
const char *tm_zone; /*當前時區的名字(與環境變量TZ有關)*/
};
#define _TM_DEFINED
中文名
struct tm
格式轉換
gmtime()和localtime()
年    份
其值等於實際年份減去1900
通    過
tm結構
用    途
獲得日期和時間

struct tm基本信息

ANSI C標準稱使用tm結構的這種時間表示為分解時間(broken-down time)。
tm_sec 有時會超過59,其中60表示閏秒。也有時候達到3位數。

struct tm格式轉換

可以使用的函數是gmtime()和localtime()將time()獲得的日曆時間time_t結構體轉換成tm結構體。
其中gmtime()函數是將日曆時間轉化為世界標準時間(即格林尼治時間),並返回一個tm結構體來保存這個時間,而localtime()函數是將日曆時間轉化為本地時間。 [1] 

struct tm程序舉例

#include <stdio.h>
#include <time.h>
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NULL);
ptr=localtime(&lt);
printf("second:%d\n",ptr->tm_sec);
printf("minute:%d\n",ptr->tm_min);
printf("hour:%d\n",ptr->tm_hour);
printf("mday:%d\n",ptr->tm_mday);
printf("month:%d\n",ptr->tm_mon+1);
printf("year:%d\n",ptr->tm_year+1900);
return 0;
}

struct tm注意事項

通過自定義的指針(struct tm *)對tm結構體成員的引用不包含賦值操作,除非另外定義tm結構體變量。
例如:
struct tm *p={0};
之類的賦值操作都是非法的。
在linux下,通過自定義指針對tm結構體成員賦值操作編譯可以通過,但執行會提示段錯誤Segmentation fault(coredump);在gdb模式下,會得到“Cannot access memory at address XXX”的警告。
如果要利用tm結構體成員保存時間數據,可以另外定義struct tm類型的變量。
例如:struct tm t;
t.tm_hour=14;
p->tm_hour=14;
如上的操作是合法的。 [2] 
參考資料