在標準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
#endif
基本介紹
- 中文名:struct tm
- 格式轉換:gmtime()和localtime()
- 年份:其值等於實際年份減去1900
- 通過:tm結構
- 用途:獲得日期和時間
基本信息,格式轉換,程式舉例,注意事項,
基本信息
ANSI C標準稱使用tm結構的這種時間表示為分解時間(broken-down time)。
tm_sec 有時會超過59,其中60表示閏秒。也有時候達到3位數。
格式轉換
可以使用的函式是gmtime()和localtime()將time()獲得的日曆時間time_t結構體轉換成tm結構體。
其中gmtime()函式是將日曆時間轉化為世界標準時間(即格林尼治時間),並返回一個tm結構體來保存這個時間,而localtime()函式是將日曆時間轉化為本地時間。
程式舉例
#include <stdio.h>
#include <time.h>
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NULL);
ptr=localtime(<);
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 *)對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;
如上的操作是合法的。