日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 时间类型详解(time_t和tm)

發布時間:2023/12/14 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 时间类型详解(time_t和tm) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們在編程中可能會經常用到時間,比如取得系統的時間(獲取系統的年、月、日、時、分、秒,星期等),或者是隔一段時間去做某事,那么我們就用到一些時間函數。

linux下存儲時間常見的有兩種存儲方式,一個是從1970年到現在經過了多少秒,一個是用一個結構來分別存儲年月日時分秒的。

time_t 這種類型就是用來存儲從1970年到現在經過了多少秒,要想更精確一點,可以用結構struct timeval,它精確到微妙。

struct timeval {long tv_sec; /*秒*/long tv_usec; /*微秒*/ }; timeval {long tv_sec; /*秒*/long tv_usec; /*微秒*/ };

而直接存儲年月日的是一個結構:

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至今已經多少年*/ 1900 p->tm_year;int tm_wday; /*星期,一周中的第幾天, 從星期日算起,0-6*/int tm_yday; /*從今年1月1日到目前的天數,范圍0-365*/int tm_isdst; /*日光節約時間的旗標*/ }; 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至今已經多少年*/ 1900 p->tm_year;int tm_wday; /*星期,一周中的第幾天, 從星期日算起,0-6*/int tm_yday; /*從今年1月1日到目前的天數,范圍0-365*/int tm_isdst; /*日光節約時間的旗標*/ };

需要特別注意的是,年份是從1900年起至今多少年,而不是直接存儲如2011年,月份從0開始的,0表示一月,星期也是從0開始的, 0表示星期日,1表示星期一。

下面介紹一下我們常用的時間函數:

#include <time.h> char *asctime(const struct tm* timeptr); <time.h> char *asctime(const struct tm* timeptr);

將結構中的信息轉換為真實世界的時間,以字符串的形式顯示

char *ctime(const time_t *timep); *ctime(const time_t *timep);

將timep轉換為真是世界的時間,以字符串顯示,它和asctime不同就在于傳入的參數形式不一樣

double difftime(time_t time1, time_t time2); difftime(time_t time1, time_t time2);

返回兩個時間相差的秒數

int gettimeofday(struct timeval *tv, struct timezone *tz); gettimeofday(struct timeval *tv, struct timezone *tz);

返回當前距離1970年的秒數和微妙數,后面的tz是時區,一般不用

struct tm* gmtime(const time_t *timep); tm* gmtime(const time_t *timep);

將time_t表示的時間轉換為沒有經過時區轉換的UTC時間,是一個struct tm結構指針

stuct tm* localtime(const time_t *timep);* localtime(const time_t *timep);

和gmtime類似,但是它是經過時區轉換的時間。

time_t mktime(struct tm* timeptr); mktime(struct tm* timeptr);

將struct tm 結構的時間轉換為從1970年至今的秒數

time_t time(time_t *t); time(time_t *t);

取得從1970年1月1日至今的秒數。

上面是簡單的介紹,下面通過實戰來看看這些函數的用法:

/*gettime1.c*/ #include <time.h>int main() {time_t timep;time(&timep); /*獲取time_t類型的當前時間*//*用gmtime將time_t類型的時間轉換為struct tm類型的時間按,//沒有經過時區轉換的UTC時間然后再用asctime轉換為我們常見的格式 Fri Jan 11 17:25:24 2008*/printf("%s", asctime(gmtime(&timep)));return 0; } #include <time.h>int main() {time_t timep;time(&timep); /*獲取time_t類型的當前時間*//*用gmtime將time_t類型的時間轉換為struct tm類型的時間按,//沒有經過時區轉換的UTC時間然后再用asctime轉換為我們常見的格式 Fri Jan 11 17:25:24 2008*/printf("%s", asctime(gmtime(&timep)));return 0; }

編譯并運行:

$gcc -o gettime1 gettime1.c $./gettime1 Fri Jan 11 17:04:08 2008-o gettime1 gettime1.c $./gettime1 Fri Jan 11 17:04:08 2008

下面是直接把time_t類型的轉換為我們常見的格式:

/* gettime2.c*/ #include <time.h>int main() {time_t timep;time(&timep); /*獲取time_t類型當前時間*/ /*轉換為常見的字符串:Fri Jan 11 17:04:08 2008*/printf("%s", ctime(&timep));return 0; } #include <time.h>int main() {time_t timep;time(&timep); /*獲取time_t類型當前時間*/ /*轉換為常見的字符串:Fri Jan 11 17:04:08 2008*/printf("%s", ctime(&timep));return 0; }

編譯并運行:

$gcc -o gettime2 gettime2.c $./gettime2 Sat Jan 12 01:25:29 2008-o gettime2 gettime2.c $./gettime2 Sat Jan 12 01:25:29 2008

我看了一本書上面說的這兩個例子如果先后執行的話,兩個的結果除了秒上有差別之外(執行程序需要時間),應該是一樣的,可是我這里執行卻發現差了很長時間按,一個是周五,一個是周六,后來我用 date 命令執行了一遍

$ date 1 12 01:25:19 CST 2008 1 12 01:25:19 CST 2008

我發現date和gettime2比較一致, 我估計可能gettime1并沒有經過時區的轉換,它們是有差別的。

/*gettime3.c */ #include <time.h>int main() {char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};time_t timep;struct tm *p;time(&timep); /*獲得time_t結構的時間,UTC時間*/p = gmtime(&timep); /*轉換為struct tm結構的UTC時間*/printf("%d/%d/%d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday);printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour,p->tm_min, p->tm_sec);return 0; } #include <time.h>int main() {char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};time_t timep;struct tm *p;time(&timep); /*獲得time_t結構的時間,UTC時間*/p = gmtime(&timep); /*轉換為struct tm結構的UTC時間*/printf("%d/%d/%d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday);printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour,p->tm_min, p->tm_sec);return 0; }

編譯并運行:

$gcc -o gettime3 gettime3.c $./gettime3 2008/1/11 Fri 17:42:54-o gettime3 gettime3.c $./gettime3 2008/1/11 Fri 17:42:54

從這個時間結果上來看,它和gettime1保持一致。

/*gettime4.c*/ #include <time.h>int main() {char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};time_t timep;struct tm *p;time(&timep); /*獲得time_t結構的時間,UTC時間*/p = localtime(&timep); /*轉換為struct tm結構的當地時間*/printf("%d/%d/%d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday);printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);return 0; } #include <time.h>int main() {char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};time_t timep;struct tm *p;time(&timep); /*獲得time_t結構的時間,UTC時間*/p = localtime(&timep); /*轉換為struct tm結構的當地時間*/printf("%d/%d/%d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday);printf("%s %d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);return 0; }

編譯并運行:

$gcc -o gettime4 gettime4.c $./gettime4 2008/1/12 Sat 1:49:29-o gettime4 gettime4.c $./gettime4 2008/1/12 Sat 1:49:29

從上面的結果我們可以這樣說:

time, gmtime, asctime 所表示的時間都是UTC時間,只是數據類型不一樣,

而localtime, ctime 所表示的時間都是經過時區轉換后的時間,它和你用系統命令date所表示的CST時間應該保持一致。

/*gettime5.c*/ #include <time.h>int main() {time_t timep;struct tm *p;time(&timep); /*當前time_t類型UTC時間*/printf("time():%d\n",timep);p = localtime(&timep); /*轉換為本地的tm結構的時間按*/timep = mktime(p); /*重新轉換為time_t類型的UTC時間,這里有一個時區的轉換*/ //by lizp 錯誤,沒有時區轉換, 將struct tm 結構的時間轉換為從1970年至p的秒數printf("time()->localtime()->mktime(): %d\n", timep);return 0; } #include <time.h>int main() {time_t timep;struct tm *p;time(&timep); /*當前time_t類型UTC時間*/printf("time():%d\n",timep);p = localtime(&timep); /*轉換為本地的tm結構的時間按*/timep = mktime(p); /*重新轉換為time_t類型的UTC時間,這里有一個時區的轉換*/ //by lizp 錯誤,沒有時區轉換, 將struct tm 結構的時間轉換為從1970年至p的秒數printf("time()->localtime()->mktime(): %d\n", timep);return 0; }

編譯并運行:

$gcc -o gettime5 gettime5.c $./gettime5 time():1200074913 time()->localtime()->mktime(): 1200074913-o gettime5 gettime5.c $./gettime5 time():1200074913 time()->localtime()->mktime(): 1200074913

這里面把UTC時間按轉換為本地時間,然后再把本地時間轉換為UTC時間,它們轉換的結果保持一致。

/*gettime6.c */ #include <time.h>int main() {time_t timep;struct tm *p;time(&timep); /*得到time_t類型的UTC時間*/printf("time():%d\n",timep);p = gmtime(&timep); /*得到tm結構的UTC時間*/timep = mktime(p); /*轉換,這里會有時區的轉換*/ //by lizp 錯誤,沒有時區轉換, 將struct tm 結構的時間轉換為從1970年至p的秒數printf("time()->gmtime()->mktime(): %d\n", timep);return 0; } #include <time.h>int main() {time_t timep;struct tm *p;time(&timep); /*得到time_t類型的UTC時間*/printf("time():%d\n",timep);p = gmtime(&timep); /*得到tm結構的UTC時間*/timep = mktime(p); /*轉換,這里會有時區的轉換*/ //by lizp 錯誤,沒有時區轉換, 將struct tm 結構的時間轉換為從1970年至p的秒數printf("time()->gmtime()->mktime(): %d\n", timep);return 0; }

編譯并運行:

$gcc -o gettime6 gettime6.c $./gettime6 time():1200075192 time()->gmtime()->mktime(): 1200046392-o gettime6 gettime6.c $./gettime6 time():1200075192 time()->gmtime()->mktime(): 1200046392

從這里面我們可以看出,轉換后時間不一致了,計算一下,整整差了8個小時( (1200075192-1200046392)/3600 = 8),說明mktime會把本地時間轉換為UTC時間,這里面本來就是UTC時間,于是再弄個時區轉換,結果差了8個小時,用的時候應該注意。

strftime() 函數將時間格式化

我們可以使用strftime()函數將時間格式化為我們想要的格式。它的原型如下:

size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr ); strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr );

我們可以根據format指向字符串中格式命令把timeptr中保存的時間信息放在strDest指向的字符串中,最多向strDest中存放maxsize個字符。該函數返回向strDest指向的字符串中放置的字符數。

函數strftime()的操作有些類似于sprintf():識別以百分號(%)開始的格式命令集合,格式化輸出結果放在一個字符串中。格式化命令說明串 strDest中各種日期和時間信息的確切表示方法。格式串中的其他字符原樣放進串中。格式命令列在下面,它們是區分大小寫的。

%a 星期幾的簡寫 %A 星期幾的全稱 %b 月分的簡寫 %B 月份的全稱 %c 標準的日期的時間串 %C 年份的后兩位數字 %d 十進制表示的每月的第幾天 %D 月/天/年 %e 在兩字符域中,十進制表示的每月的第幾天 %F 年-月-日 %g 年份的后兩位數字,使用基于周的年 %G 年分,使用基于周的年 %h 簡寫的月份名 %H 24小時制的小時 %I 12小時制的小時 %j 十進制表示的每年的第幾天 %m 十進制表示的月份 %M 十時制表示的分鐘數 %n 新行符 %p 本地的AMPM的等價顯示 %r 12小時的時間 %R 顯示小時和分鐘:hh:mm %S 十進制的秒數 %t 水平制表符 %T 顯示時分秒:hh:mm:ss %u 每周的第幾天,星期一為第一天 (值從06,星期一為0 %U 第年的第幾周,把星期日做為第一天(值從053 %V 每年的第幾周,使用基于周的年 %w 十進制表示的星期幾(值從06,星期天為0 %W 每年的第幾周,把星期一做為第一天(值從053 %x 標準的日期串 %X 標準的時間串 %y 不帶世紀的十進制年份(值從099 %Y 帶世紀部分的十制年份 %z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。 %% 百分號a 星期幾的簡寫 %A 星期幾的全稱 %b 月分的簡寫 %B 月份的全稱 %c 標準的日期的時間串 %C 年份的后兩位數字 %d 十進制表示的每月的第幾天 %D 月/天/年 %e 在兩字符域中,十進制表示的每月的第幾天 %F 年-月-日 %g 年份的后兩位數字,使用基于周的年 %G 年分,使用基于周的年 %h 簡寫的月份名 %H 24小時制的小時 %I 12小時制的小時 %j 十進制表示的每年的第幾天 %m 十進制表示的月份 %M 十時制表示的分鐘數 %n 新行符 %p 本地的AMPM的等價顯示 %r 12小時的時間 %R 顯示小時和分鐘:hh:mm %S 十進制的秒數 %t 水平制表符 %T 顯示時分秒:hh:mm:ss %u 每周的第幾天,星期一為第一天 (值從06,星期一為0 %U 第年的第幾周,把星期日做為第一天(值從053 %V 每年的第幾周,使用基于周的年 %w 十進制表示的星期幾(值從06,星期天為0 %W 每年的第幾周,把星期一做為第一天(值從053 %x 標準的日期串 %X 標準的時間串 %y 不帶世紀的十進制年份(值從099 %Y 帶世紀部分的十制年份 %z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。 %% 百分號

如果想顯示現在是幾點了,并以12小時制顯示,就象下面這段程序:

#include "time.h" #include "stdio.h" int main(void) {struct tm *ptr;time_t lt;char str[80];lt=time(NULL);ptr=localtime(<);strftime(str,100,"It is now %I %p",ptr);printf(str);return 0; } "time.h" #include "stdio.h" int main(void) {struct tm *ptr;time_t lt;char str[80];lt=time(NULL);ptr=localtime(<);strftime(str,100,"It is now %I %p",ptr);printf(str);return 0; }

其運行結果為:

It is now 4PM is now 4PM

而下面的程序則顯示當前的完整日期:

#include<stdio.h> #include<string.h> #include<time.h> int main( void ) {struct tm *newtime;char tmpbuf[128];time_t lt1;time( &lt1 );newtime=localtime(&lt1);strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);printf(tmpbuf);return 0; }<stdio.h> #include<string.h> #include<time.h> int main( void ) {struct tm *newtime;char tmpbuf[128];time_t lt1;time( &lt1 );newtime=localtime(&lt1);strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);printf(tmpbuf);return 0; }

總結

以上是生活随笔為你收集整理的c++ 时间类型详解(time_t和tm)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。