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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CRT中的时间(time_t和tm)

發(fā)布時(shí)間:2025/3/12 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CRT中的时间(time_t和tm) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
時(shí)間處理時(shí)實(shí)際項(xiàng)目中經(jīng)常碰到的問題,這里介紹最常用的時(shí)間處理函數(shù)。

??? 首先介紹基本的時(shí)間概念。時(shí)間一般分為兩種,一種是本地時(shí)間(Local Time),一種是協(xié)調(diào)世界時(shí)間(Coordinated Universal Time ,UTC),也就是傳說中的格林威治時(shí)間。本地時(shí)間與UTC時(shí)間之間的差即為時(shí)差,比如,北京時(shí)間(東八區(qū))比UTC時(shí)間晚8個小時(shí)。

??? C運(yùn)行庫中處理時(shí)間的函數(shù)主要是這四個:

????

[cpp] view plaincopy print?
  • time_t?time(??
  • ????????????time_t?*timer);??
  • ???
  • time_t time(time_t *timer);

    ??? time_t類型為32位或64位整型,具體類型由編譯系統(tǒng)決定。此函數(shù)用來獲得從1970年1月1日子夜(這個時(shí)刻在不同的CRT實(shí)現(xiàn)中可能會不一樣)到當(dāng)前時(shí)刻以來所流逝的時(shí)間,以秒為單位。這個時(shí)間差叫做日歷時(shí)間(Calendar Time )。

    ??? 這是當(dāng)然讓我困惑的地方:這個特殊的時(shí)刻——1970年1月1日零時(shí)零分零秒——是指本地時(shí)間呢,還是UTC時(shí)間呢?我認(rèn)為是本地時(shí)間,也就是各個時(shí)區(qū)自己的1970年1月1日零時(shí)零分零秒。可以設(shè)想這樣一種情況,如果全球24時(shí)區(qū)各有一臺電腦,都依次在自己所在時(shí)區(qū)的本地時(shí)間1970年1月1日零時(shí)1分零秒調(diào)用time函數(shù),那么返回值都是60。注意,這里是依次調(diào)用(事實(shí)上是每隔1小時(shí)),而不是想象中的同時(shí)調(diào)用,這是因?yàn)橄噜彆r(shí)區(qū)的同一本地時(shí)間,總是相差1小時(shí)。

    ??? 當(dāng)然,time_t型的時(shí)間方便計(jì)算機(jī)處理,但普通用戶無法理解這種數(shù)字。所以我們通常需要將time_t型時(shí)間轉(zhuǎn)換成我們平常所見的年月日形式。CRT中為此定義了tm結(jié)構(gòu)。

    ???

    [cpp] view plaincopy print?
  • struct?tm?{??
  • ????int?tm_sec;?????/*?seconds?after?the?minute?-?[0,59]?*/??
  • ????int?tm_min;?????/*?minutes?after?the?hour?-?[0,59]?*/??
  • ????int?tm_hour;????/*?hours?since?midnight?-?[0,23]?*/??
  • ????int?tm_mday;????/*?day?of?the?month?-?[1,31]?*/??
  • ????int?tm_mon;?????/*?months?since?January?-?[0,11]?*/??
  • ????int?tm_year;????/*?years?since?1900?*/??
  • ????int?tm_wday;????/*?days?since?Sunday?-?[0,6]?*/??
  • ????int?tm_yday;????/*?days?since?January?1?-?[0,365]?*/??
  • ????int?tm_isdst;???/*?daylight?savings?time?flag?*/??
  • };??
  • struct tm {int tm_sec; /* seconds after the minute - [0,59] */int tm_min; /* minutes after the hour - [0,59] */int tm_hour; /* hours since midnight - [0,23] */int tm_mday; /* day of the month - [1,31] */int tm_mon; /* months since January - [0,11] */int tm_year; /* years since 1900 */int tm_wday; /* days since Sunday - [0,6] */int tm_yday; /* days since January 1 - [0,365] */int tm_isdst; /* daylight savings time flag */ };

    ??? 注釋中已詳細(xì)解釋了各個字段的用法。顯然這個結(jié)構(gòu)中的字段對用戶更有意義。我們通常用localtime_s函數(shù)將time_t時(shí)間轉(zhuǎn)換為tm時(shí)間。

    ???

    [cpp] view plaincopy print?
  • errno_t?localtime_s(??
  • ????????????????????struct?tm*?_tm,??
  • ????????????????????const?time_t?*time);??
  • errno_t localtime_s(struct tm* _tm,const time_t *time);

    ??? 其中第二個參數(shù)為傳入的time_t時(shí)間,第一個參數(shù)為返回的tm時(shí)間。由函數(shù)名可看出,返回的tm時(shí)間表示的是本地時(shí)間。當(dāng)然,我們有時(shí)候也需要獲得對應(yīng)的UTC時(shí)間,這時(shí)我們需要gmtime函數(shù)。

    ???

    [cpp] view plaincopy print?
  • errno_t?gmtime_s(??
  • ?????????????????struct?tm*?_tm,??
  • ?????????????????const?time_t*?time);??
  • errno_t gmtime_s(struct tm* _tm,const time_t* time);

    ??? 后面我們會看到兩者的區(qū)別。

    ??? 我們知道了如何將time_t時(shí)間轉(zhuǎn)換為tm時(shí)間。同樣,我們會需要將tm表示的時(shí)間轉(zhuǎn)換為time_t時(shí)間。這時(shí)我們需要mktime函數(shù)。

    ???

    [cpp] view plaincopy print?
  • time_t?mktime(??
  • ??????????????struct?tm?*timeptr);??
  • time_t mktime(struct tm *timeptr);

    ??? 此函數(shù)返回從"特殊時(shí)刻"到參數(shù)表示的時(shí)刻之間流逝的日歷時(shí)間。另外還有個很好用的特性,就是它能修正傳進(jìn)來的tm結(jié)構(gòu)中各字段的取值范圍。比如,如果你將tm.tm_mon設(shè)為1,tm.tm_day設(shè)為33,然后以其為參數(shù)調(diào)用mktime函數(shù),此函數(shù)會將tm.tm_mon修正為2,tm.tm_day修正為2。具體用法參照MSDN。

    ??? 我們來分析下面示例代碼:

    ???

    [cpp] view plaincopy print?
  • #include?<stdlib.h>??
  • #include?<stdio.h>??
  • #include?<time.h>??
  • ??
  • ??
  • int?main()??
  • {??
  • ????struct?tm???tmLocal,?tmUTC;??
  • ????time_t??tNow;??
  • ????//Get?current?calendar?time??
  • ????time(&tNow);??
  • ????printf("Time?Now?from?time():?%llu/n",?tNow);?????
  • ????//Get?current?local?time??
  • ????localtime_s(&tmLocal,?&tNow);???
  • ????printf("Local?Time(YYYY-MM-DD?HH:MM:SS):?%d-%d-%d?%d:%d:%d/n",?tmLocal.tm_year?+?1900,?tmLocal.tm_mon,??
  • ????????tmLocal.tm_mday,?tmLocal.tm_hour,?tmLocal.tm_min,?tmLocal.tm_sec);??
  • ????//Get?UTC?time?corresponding?to?current?local?time,?and?tmLocal.tm_hour?-?tmUTC.tm_hour?=?8??
  • ????gmtime_s(&tmUTC,?&tNow);??????
  • ????printf("UTC?Time??(YYYY-MM-DD?HH:MM:SS):?%d-%d-%d?%d:%d:%d/n",?tmUTC.tm_year?+?1900,?tmUTC.tm_mon,??
  • ????????tmUTC.tm_mday,?tmUTC.tm_hour,?tmUTC.tm_min,?tmUTC.tm_sec);??
  • ????//convert?tmLocal?to?calendar?time??
  • ????tNow?=?mktime(&tmLocal);??????
  • ????printf("Time?Now?from?mktime():?%llu/n",?tNow);??
  • ??
  • ????return?EXIT_SUCCESS;??
  • }??
  • #include <stdlib.h> #include <stdio.h> #include <time.h>int main() {struct tm tmLocal, tmUTC;time_t tNow;//Get current calendar timetime(&tNow);printf("Time Now from time(): %llu/n", tNow); //Get current local timelocaltime_s(&tmLocal, &tNow); printf("Local Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", tmLocal.tm_year + 1900, tmLocal.tm_mon,tmLocal.tm_mday, tmLocal.tm_hour, tmLocal.tm_min, tmLocal.tm_sec);//Get UTC time corresponding to current local time, and tmLocal.tm_hour - tmUTC.tm_hour = 8gmtime_s(&tmUTC, &tNow); printf("UTC Time (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", tmUTC.tm_year + 1900, tmUTC.tm_mon,tmUTC.tm_mday, tmUTC.tm_hour, tmUTC.tm_min, tmUTC.tm_sec);//convert tmLocal to calendar timetNow = mktime(&tmLocal); printf("Time Now from mktime(): %llu/n", tNow);return EXIT_SUCCESS; }

    ??? 輸出結(jié)果如下:

    ???

    ??? 上面代碼中,11行time函數(shù)獲得從"特殊時(shí)刻"到當(dāng)前時(shí)刻的日歷時(shí)間,如輸出結(jié)果中的第一行顯示的1267192581秒。

    ??? 14行l(wèi)ocaltime_s函數(shù)將日歷時(shí)間轉(zhuǎn)換為本地tm時(shí)間,如輸出結(jié)果第二行。

    ????18行g(shù)mtime_s函數(shù)將將日歷時(shí)間轉(zhuǎn)換為對應(yīng)的UTC的tm時(shí)間,如輸出結(jié)果第三行顯示。很容易看出,第二,三行輸出的時(shí)間相差8小時(shí),因?yàn)槲以跂|八區(qū)。如果你修改自己電腦的時(shí)區(qū)(在控制面板的Date and Time中修改),再運(yùn)行此程序,比較兩次的運(yùn)行結(jié)果,你就可以更好的理解了。

    ????22行mktime函數(shù)將tm時(shí)間轉(zhuǎn)換為日歷時(shí)間,輸出結(jié)果中第四行顯示的結(jié)果與第一行一樣,這是必須的。。。

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。