C語言時間函式的應用

2022-12-20 03:24:03 字數 4293 閱讀 9892

c語言時間函式的應用c語言時間函式的應用

c語言程式,常涉及時間的獲取和計算,例如獲取當前時間,倒計時計算,時間差計算。

c/c++語言提供了一些庫函式,可用於此目的。下面以vc++ 6.0編譯器為例,敘述c語言時間函式的應用,呼叫時間函式需標頭檔案

(1)獲取現在時間並列印

c語言提供函式time(),可以獲取現在時間。函式原型是time_t time ( time_t *t);

你可以通過實參獲取時間,也可以通過返回值獲取時間。例如:time_t now;

now = time(null);或time(&now);

得到的time_t型數值是從2023年1月1日起到現在的秒數。

用c語言提供的函式ctime轉換成字串形式,列印出年月日時分秒。見下面程式裡的print_current_time()子程式。

(2)獲取現在時間並轉換成整數年月日時分秒形式

c語言提供的函式localtime(),可以把time_t數值轉換成tm結構,tm結構裡含年月日時分秒和是否是閏年等資訊,結構裡的年加1900是真實的年,結構裡的月加1是真實的月。

見子程式get_current_ymd().

(3)輸入年月日計算這天是該年的第幾天

當我們要繪製某年度的統計資料時,常以天做橫座標按比例繪圖,這時就需要把月日換算為天。

把日加上前幾個月的天數就可得結果。只要注意該年是平年還是閏年,閏年的2月份多一天。閏年的判斷是:

if ((y%4==0)&&(y%100!=0)||(y%400==0) 見子程式ymd_2_jd();

(4)輸入年月日計算這天是星期幾

公元計年從1年1月1日開始,這天是星期一。平年一年有365天,365除7取餘數為1。也就是說平年的星期幾等於上一年的星期幾加1。閏年的星期幾等於上一年的星期幾加2。

所以,若知年份,就可以推算出這年元旦推移了多少天,變星期幾,再呼叫ymd_2_jd(),算出某月某日推移了多少天,就算得這天是星期幾。見子程式ymd_2_weekday()。

(5)輸入整型值年月日時分秒轉換為time_t

庫函式mktime,可以把tm結構轉換為time_t。

我們可以用localtime把當前時間轉為tm結構,再修改裡面的年月日時分秒,這樣,tm裡的其它項,例如星期幾,這天是該年的第幾天等成員變數會自動改

正,不須自己操心。然後調mktime,得到time_t型時間值。

(6)暫停多少秒或多少毫秒的控制

暫停,可以用裡的sleep()函式,也可以自己寫。

sleep(1000);引數是1000毫秒,就是暫停1秒。一般人認為,sleep函式,每秒可能有25毫秒誤差。

自己寫,可以利用clock ()函式,clock ()函式送返從程式開始執行到呼叫時的時間間隔,單位是毫秒。暫停開始,用clock()取開始時間,然後,只要用clock ()再取時間,判斷是否到結束時間,沒到則繼續暫停。見子程式wait (int seconds)和wait_ms ( int ms )。

(7)倒計時

輸入目標年月日時分秒,顯示倒計時。

先把目標日期轉換為time_t,然後取當前時間,用庫函式difftime()計算時間差單位秒,折算成倒計時時分秒。見子程式time_down()

(8)時間差計算

獲取時間差有多種方法。簡單方法是用clock()函式。clock()函式返回當時時間讀數,計時開始用clock()得到開始時間,計時結束,用clock()得到結束時間,兩個數相減就是時間差,單位是毫秒。

見子程式example_dt_ms()。

另一種方法是用queryperformancecounter()函式返回當時時鐘讀數,計時開始用它得到開始讀數,計時結束用它得到結束讀數,兩個數相減是時間差讀數。讀數轉換為時間,要用queryperformancefrequency()函式獲得時鐘頻率,讀數除以時鐘頻率,得時間,單位是秒。乘1000得毫秒。

據說,這種方法比較精確。

見子程式accurate_dt_ms()。

還有一種方法是用pentium晶元彙編指令0x0f和0x31,讀取時鐘計數圖章,類似queryperformancecounter()函式,計時開始和結束分別呼叫一次,得讀數差,並扣除執行一次呼叫函式消耗的額外時間。讀數差怎樣轉化成時間是個問題,如果知道cpu速度可以算得時間,如果知道時間,可以估算cpu速度。子程式get_cpu_speed()計算cpu的速度,單位百萬赫。

完整的c語言示範程式如下:#define nominmax#include <>#include <>#include <>

#include <>

char *weekdayname=;void example_dt_ms();void accurate_dt_ms();void print_current_time();

void get_current_ymd(int *y,int *m,int *d,int *hh,int *mm, int *ss);void get_current_tm(struct tm * timeinfo);int ymd_2_jd(int y, int m, int d);

int ymd_2_weekday(int y, int m, int d); // 1,2,3,4,5,6,7void wait ( int seconds );void wait_ms ( int ms );

time_t ymd_hhmmss_2_s70(int y, int m, int d, int hh, int mm, int ss);void check_mk(int y, int m, int d, int hh, int mm, int ss);void time_down(int y, int m, int d, int hh, int mm, int ss);__forceinline unsigned _int64 my_clock(void);unsigned _int64 start(void);

unsigned _int64 stop(unsigned _int64 m_start, unsigned _int64m_overhead);

void get_cpu_speed();

void main()

void example_dt_ms();wait_ms(2000);tick2=clock();

dt = (double) (tick2 - tick1);

printfnexample_dt_ms:\n");printf("dt = %lf ms\n",dt);}

void accurate_dt_ms()

void print_current_time()

void get_current_ymd(int *y,int *m,int *d,int *hh,int *mm, int *ss)

int ymd_2_jd(int y, int m, int d);int jd,i;jd=d;

for (i=1;iif ((y%4==0)&&(y%100!=0)||(y%400==0) && m>2) jd++;return jd;}

int ymd_2_weekday(int y, int m, int d)

void wait ( int seconds )}

void wait_ms ( int ms )}

time_t ymd_hhmmss_2_s70(int y, int m, int d, int hh, int mm, int ss)

void time_down(int y, int m, int d, int hh, int mm, int ss)

}// pentium instruction "read time stamp counter".__forceinline unsigned _int64 my_clock(void)

unsigned _int64 start(void)

unsigned _int64 stop(unsigned _int64 m_start, unsigned _int64m_overhead)

void get_cpu_speed(){

unsigned _int64 m_start=0, m_overhead=0;unsigned int cpuspeedmhz;m_start = my_clock();

m_overhead = my_clock() - m_start - m_overhead;

printf("overhead for calling my_clock=%i64d\n", m_overhead);m_start = my_clock();wait_ms(2000);

cpuspeedmhz=(unsigned int) ( (my_clock()- m_start - m_overhead) /2000000);

printf("cpu_speed_mhz: %u\n",cpuspeedmhz);

C語言函式大全

函式名 abort 功能 異常終止乙個程序 用法 void abort void 函式名 abs 功能 求整數的絕對值 用法 int abs int i 函式名 absread,abswirte 功能 絕對磁碟扇區讀 寫資料 用法 int absread int drive,int nsects,i...

C語言函式用法大全

函式名 stpcpy 功能 拷貝乙個字串到另乙個 用法 char stpcpy char destin,char source 程式例 include include int main void 函式名 strcat 功能 字串拼接函式 用法 char strcat char destin,char...

C語言庫函式大全

absread 讀磁碟絕對扇區函式 原形 int absread int drive,int num,int sectnum,void buf 功能 從drive指定的驅動器磁碟上,sectnum指定的邏輯扇區號開始讀取 通過dos中斷0x25讀取 num個 最多64k個 扇區的內容,儲存於buf所...