1. 程式人生 > >time(NULL)與GetLocalTime獲取當前時間

time(NULL)與GetLocalTime獲取當前時間

到#inlcude  <time.h>標頭檔案裡的一個time()函式和localtime()函式  

函式原型:  time_t  time(time_t  *timer)      

 函式用途:  得到機器的日曆時間或者設定日曆時間      

 頭  文  件:  time.h    

 輸入引數:  timer:=NULL時,得到機器日曆時間,=時間數值時  用於設定日曆時間;  

 time_t是一個long型別  

  函式原型:  struct  tm  *localtime(const  time_t  *timer)    
  函式用途:  返回一個以tm結構表達的機器時間資訊    
  頭  文  件:  time.h    
  輸入引數:  timer:使用time()函式獲得的機器時間;  
    
  結構tm的定義為:  
  struct  tm  
  {  
  int tm_sec; /*  Seconds:  0-59  (K&R  says  0-61?)  */  
  int tm_min; /*  Minutes:  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  Jan.  1:  0-365  */  
  int tm_isdst; /*  +1  Daylight  Savings  Time,  0  No  DST,  
    *  -1  don't  know  */  
  };  
舉個例子: 
#include "stdafx.h"
#include  <time.h>  
#include  <stdio.h>  
#include <wtypes.h>

int main(int argc, char* argv[])
{
 time_t  t;  
 tm  *tp;  
 t=time(NULL);  
//  既然time_t實際上是長整型,到未來的某一天,從一個時間點(一般是1970年1月1日0時0分0秒)
//  到那時的秒數(即日曆時間)超出了長整形所能表示的數的範圍怎麼辦?對time_t資料型別的值來說,
//  它所表示的時間不能晚於2038年1月18日19時14分07秒。為了能夠表示更久遠的時間,一些編譯器廠商
//  引入了64位甚至更長的整形數來儲存日曆時間。比如微軟在Visual C++中採用了__time64_t資料型別來
//  儲存日曆時間,並通過_time64()函式來獲得日曆時間(而不是通過使用32位字的time()函式),這樣
//  就可以通過該資料型別儲存3001年1月1日0時0分0秒(不包括該時間點)之前的時間。

 tp=localtime(&t);  
 printf("%d/%d/%d/n",tp->tm_mon+1,tp->tm_mday,tp->tm_year+1900);  
 printf("%d:%d:%d/n",tp->tm_hour,tp->tm_min,tp->tm_sec); 
 
 SYSTEMTIME stCurTime = {0};
 ::GetLocalTime(&stCurTime);

// 注意區分GetSystemTime(&stCurTime);的區別
 printf("%d/%d/%d/n",stCurTime.wMonth,stCurTime.wDay,stCurTime.wYear);  
 printf("%d:%d:%d/n",stCurTime.wHour,stCurTime.wMinute,stCurTime.wSecond); 
 return 0;
}

產生一定範圍隨機數的通用表示公式

      要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a (結果值含a不含b)。
      要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a (結果值含a和b)。
      要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1 (結果值不含a含b)。

      (總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數的範圍)

      要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。

      要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。

產生相同的隨機數的原因

      計算機的隨機數都是由偽隨機數,即是由小M多項式序列生成的,其中產生每個小序列都有一個初始值,即隨機種子。(注意: 小M多項式序列的週期是65535,即每次利用一個隨機種子生成的隨機數的週期是65535,當你取得65535個隨機數後它們又重複出現了。)  

      我們知道rand()函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是一個偽隨機數,是根據一個數(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。 

定義函式:time_t mktime(strcut tm * timeptr);

函式說明:mktime()用來將引數timeptr 所指的tm 結構資料轉換成從公元1970 年1 月1 日0 時0 分0 秒算起至今的UTC 時間所經過的秒數。

返回值:返回經過的秒數。

localtime是直接返回strcut tm*指標(如果成功的話);這個指標是指向一個靜態變數的;因此,返回的指標所指向的靜態變數有可能被其他地方呼叫的localtime改掉,例如多執行緒使用的時候。

localtime_r則是由呼叫者在第二個引數傳入一個struct tm result指標,該函式會把結果填充到這個傳入的指標所指記憶體裡面;成功的返回值指標也就是struct tm result。

其他的時間函式,如asctime,asctime_r;ctime,ctime_r;gmtime,gmtime_r都是類似的,所以,時間函式的 _r 版本都是執行緒安全的。