轉(zhuǎn)載總結(jié)http://blog.csdn.net/luoweifu/article/details/20288549
unix時間戳定義為從當(dāng)前到1970.1.1 0時0分0秒,這中間的秒數(shù)。使用32位表示的時間戳最多到2038年01月19日03時14分07秒。
linux下存儲時間常見的有兩種存儲方式,一個是從1970年到現(xiàn)在經(jīng)過了多少秒,一個是用一個結(jié)構(gòu)來分別存儲年月日時分秒的。
time_t 這種類型就是用來存儲從1970年到現(xiàn)在經(jīng)過了多少秒,要想更精確一點(diǎn),可以用結(jié)構(gòu)struct timeval,它精確到微秒。
struct timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
而直接存儲年月日的是一個結(jié)構(gòu):
struct tm{
int tm_sec; /*秒,正常范圍0-59, 但允許至61*/
int tm_min; /*分鐘,0-59*/
int tm_hour; /*小時, 0-23*/
int tm_mday; /*日,即一個月**中的**第幾天,1-31*/
int tm_mon; /*月, 從一月算起,0-11*/ 1+p->tm_mon;
int tm_year; /*年, 從1900至今已經(jīng)多少年*/ 1900+ p->tm_year;
int tm_wday; /*星期,一周**中的**第幾天, 從星期日算起,0-6*/
int tm_yday; /*從今年1月1日到目前的天數(shù),范圍0-365*/
int tm_isdst; /*日光節(jié)約時間的旗標(biāo)*/
};
需要特別注意的是,年份是從1900年起至今多少年,而不是直接存儲如2011年,月份從0開始的,0表示一月,星期也是從0開始的, 0表示星期日,1表示星期一。
函數(shù)
- time_t time(time_t *)
獲取當(dāng)前系統(tǒng)時間,參數(shù)可為NULL
精確到秒,而且,傳入的參數(shù)和不傳沒啥區(qū)別啊。
struct tm *gmtime(long *)
將參數(shù)所表示的秒,轉(zhuǎn)化為結(jié)構(gòu)體tm。實(shí)際參數(shù)可以是time_t。
注意返回的是指針。
返回的時間是格林威治時間,也就是0時區(qū)的時間。
不是線程安全的。struct tm *localtime(const time_t *)
同上,但是返回的時間是本時區(qū)的時間。
不是線程安全的。
使用后的返回值需要立即處理,因?yàn)橄乱淮蔚脑摵瘮?shù)的返回值會覆蓋上一次的。也就是說,如果連續(xù)兩次使用改行數(shù),其返回值是一樣的,后一個函數(shù)的返回值,所以不是線程安全的struct tm *gmtime_r(const time_t *timep, struct tm *result)和struct tm localtime_r(const time_t *timep, struct tm *result)
是線程安全的。
創(chuàng)建值的tm然后傳入。如果創(chuàng)建指針,然后傳入,在運(yùn)行的時候會報錯。
返回值可以無視,因?yàn)椴⒉粫祷?。讀取會出錯。第二個參數(shù)被填充。time_t mktime(strcut tm * timeptr);
上述過程的反向轉(zhuǎn)換char *asctime(const struct tm *tblock)和 char *ctime(const time_t *time)
格式化時間,兩個函數(shù)的區(qū)別是,接受的參數(shù)不同。
形如:Mon Feb 16 11:29:26 2009
7.size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr)
與上一個相同,但是會格式化為我們指定的格式。
8.double difftime(time_t time1, time_t time0)
計算時間間隔才長度。精度為秒。
- int gettimeofday(struct timeval*tv,struct timezone *tz )
把目前的時間用tv 結(jié)構(gòu)體返回,當(dāng)?shù)貢r區(qū)的信息則放到tz所指的結(jié)構(gòu)中,精確到微秒。
第二個參數(shù)可為空。