日韩性视频-久久久蜜桃-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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 97色在线观看 | 午夜久久视频 | 国产三区在线播放 | 香蕉视频在线免费播放 | 粉嫩av一区二区三区四区五区 | 中文字幕一区二区三区门四区五区 | 好吊视频一区二区三区四区 | 嫩草影院av| 91av欧美 | 在线视频免费观看一区 | 国产一区久久久 | 69一区二区 | 中文字幕日韩三级片 | 女人久久久 | 亚洲免费精品视频在线观看 | 亚洲av无码久久精品狠狠爱浪潮 | 激情视频激情小说 | 国产成人免费视频网站 | 专业操老外 | 亚洲欧美日韩另类 | 成人精品在线视频 | 亚洲一区影院 | 久久久噜噜噜久久中文字幕色伊伊 | 91精品视频国产 | 国产一区二区91 | 欧美极品少妇xxxxⅹ免费视频 | 97精品| 污视频网站在线看 | 在线视频免费观看一区 | 凸凹人妻人人澡人人添 | 在线操| 性欧美69| av在线播放免费 | 国产成人自拍偷拍 | 日韩精品欧美在线 | 久久免费看片 | 亚洲无码一区二区三区 | 国语对白做受欧美 | 777777av | 日韩天堂视频 | 九九视频免费看 | 国产成年妇视频 | 美女扒开粉嫩的尿囗给男生桶 | 在线观看免费毛片 | 伊人久久久久久久久久 | 国产精品3p视频 | 国产精品不卡在线观看 | 韩国美女主播跳舞 | 男女视频免费观看 | 国产精品午夜电影 | 日韩一级在线 | 在线观看视频二区 | 亚洲国产一区二区在线 | 日韩一页 | 国产精品一卡 | 国产黄页 | 亚洲精品一卡二卡 | 天天干,夜夜爽 | 免费黄色资源 | 成人在线日韩 | 亚洲图区欧美 | 国产精品无码一区二区无人区多人 | 色老头影视 | 成人av中文字幕 | 黑人三级视频 | wwwwxxxx欧美 | 日本久久一区 | www夜色| 麻豆精品在线播放 | www.日本黄色 | 欧美在线观看a | 肉色丝袜脚交一区二区 | 亚洲精品第一 | 成人免费在线视频观看 | 日日影院 | 午夜aaa| 日韩女优一区二区 | 国产国语性生话播放 | 亚洲琪琪 | 精品免费国产一区二区三区 | 欧美一级艳片视频免费观看 | 日韩激情视频在线观看 | 久久精品国产亚洲av麻豆图片 | 69久久精品无码一区二区 | 国产精品jizz在线观看软件 | 国产无遮挡又黄又爽在线观看 | 国产福利二区 | 超碰2023| 中文字幕永久在线观看 | 久久国产人妻一区二区免色戒电影 | 午夜影院在线看 | 性xxxx视频| 秘密基地在线观看完整版免费 | 1515hh成人免费看 | av在线最新 | 天天干天天爱天天操 | 一区二区精品视频 | 免费看欧美黄色片 | 6699嫩草久久久精品影院 |