天天看點

VC擷取系統時間、程式運作時間(精确毫秒) GetCurrentTime(),GetLocalTime(),GetSystemTime()之間的差別

1.使用CTime類(擷取系統目前時間,精确到秒)

CString str;

//擷取系統時間

CTime tm;

tm=CTime::GetCurrentTime();//擷取系統日期

str=tm.Format("現在時間是%Y年%m月%d日 %X");

MessageBox(str,NULL,MB_OK);

a,從CTimet中提取年月日時分秒 

 CTime t = CTime::GetCurrentTime(); 

  int d=t.GetDay(); //獲得幾号

  int y=t.GetYear(); //擷取年份

  int m=t.GetMonth(); //擷取目前月份

  int h=t.GetHour(); //擷取目前為幾時

  int mm=t.GetMinute(); //擷取分鐘

  int s=t.GetSecond(); //擷取秒

  int w=t.GetDayOfWeek(); //擷取星期幾,注意1為星期天,7為星期六

b,計算兩段時間的內插補點,可以使用CTimeSpan類,具體使用方法如下:

  CTime t1( 1999, 3, 19, 22, 15, 0 );

      CTime t = CTime::GetCurrentTime();

      CTimeSpan span=t-t1; //計算目前系統時間與時間t1的間隔

  int iDay=span.GetDays(); //擷取這段時間間隔共有多少天

  int iHour=span.GetTotalHours(); //擷取總共有多少小時

  int iMin=span.GetTotalMinutes();//擷取總共有多少分鐘

  int iSec=span.GetTotalSeconds();//擷取總共有多少秒

c,獲得目前日期和時間,并可以轉化為CString

  CTime tm=CTime::GetCurrentTime(); CString str=tm.Format("%Y-%m-%d");//顯示年月日

2.使用GetLocalTime:Windows API 函數,擷取當地的目前系統日期和時間 (精确到毫秒)

  此函數會把擷取的系統時間資訊存儲到SYSTEMTIME結構體裡邊

  typedef struct _SYSTEMTIME

  {

  WORD wYear;//年

  WORD wMonth;//月

  WORD wDayOfWeek;//星期:0為星期日,1為星期一,2為星期二……

  WORD wDay;//日

  WORD wHour;//時

  WORD wMinute;//分

  WORD wSecond;//秒

  WORD wMilliseconds;//毫秒

  }SYSTEMTIME,*PSYSTEMTIME;

例:

SYSTEMTIME st;

CString strDate,strTime;

GetLocalTime(&st);

strDate.Format("%4d-%2d-%2d",st.wYear,st.wMonth,st.wDay);

strTime.Format("%2d:%2d:%2d",st.wHour,st.wMinute,st.wSecond) ;

AfxMessageBox(strDate);

AfxMessageBox(strTime);

3.使用GetTickCount:從作業系統啟動到現在所經過(elapsed)的毫秒數,它的傳回值是DWORD。(精确到毫秒)

//擷取程式運作時間

long t1=GetTickCount();//程式段開始前取得系統運作時間(ms)

Sleep(500);

long t2=GetTickCount();();//程式段結束後取得系統運作時間(ms)

str.Format("time:%dms",t2-t1);//前後之差即 程式運作時間

AfxMessageBox(str);

//擷取系統運作時間

long t=GetTickCount();

CString str,str1;

str1.Format("系統已運作 %d時",t/3600000);

str=str1;

t%=3600000;

str1.Format("%d分",t/60000);

str+=str1;

t%=60000;

str1.Format("%d秒",t/1000);

str+=str1;

AfxMessageBox(str);

4.使用time_t time( time_t * timer ) :   僅使用C标準庫(精确到秒)

得到從标準計時點(一般是1970年1月1日午夜)到目前時間的秒數  

  計算時間差:double difftime( time_t timer1, time_t timer0)

       struct tm *localtime(const time_t *timer);  取得當地時間,localtime擷取的結果由結構tm傳回  

傳回的字元串可以依下列的格式而定:  

%a 星期幾的縮寫。Eg:Tue  

%A 星期幾的全名。 Eg: Tuesday  

%b 月份名稱的縮寫。  

%B 月份名稱的全名。  

%c 本地端日期時間較佳表示字元串。  

%d 用數字表示本月的第幾天 (範圍為 00 至 31)。日期  

%H 用 24 小時制數字表示小時數 (範圍為 00 至 23)。  

%I 用 12 小時制數字表示小時數 (範圍為 01 至 12)。  

%j 以數字表示當年度的第幾天 (範圍為 001 至 366)。  

%m 月份的數字 (範圍由 1 至 12)。  

%M 分鐘。  

%p 以 ''AM'' 或 ''PM'' 表示本地端時間。  

%S 秒數。  

%U 數字表示為本年度的第幾周,第一個星期由第一個周日開始。  

%W 數字表示為本年度的第幾周,第一個星期由第一個周一開始。  

%w 用數字表示本周的第幾天 ( 0 為周日)。  

%x 不含時間的日期表示法。  

%X 不含日期的時間表示法。 Eg: 15:26:30  

%y 二位數字表示年份 (範圍由 00 至 99)。  

%Y 完整的年份數字表示,即四位數。 Eg:2008  

%Z(%z) 時區或名稱縮寫。Eg:中國标準時間  

%% % 字元。 

5.要擷取高精度時間,可以使用

    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)擷取系統的計數器的頻率

    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)擷取計數器的值

    然後用兩次計數器的差除以Frequency就得到時間。

6.還有David的文章中提到的方法:

    Multimedia Timer Functions

    The following functions are used with multimedia timers.

    timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime

    timeGetTime/timeKillEvent/TimeProc/timeSetEvent 精度很高 

Q:

GetTickCount()函數,說是毫秒記數,是真的嗎,還是精确到55毫秒?

A:

GetTickCount()和GetCurrentTime()都隻精确到55ms(1個tick就是55ms)。如果要精确到毫秒,應該使用timeGetTime函數或QueryPerformanceCounter函數。具體例子可以參考QA001022 "VC++中使用高精度定時器"、QA001813 "如何在Windows實作準确的定時"和QA004842 "timeGetTime函數延時不準"。

Q:

vc++怎樣擷取系統時間,傳回值是什麼類型的變量呢? 

A:

GetSystemTime傳回的是格林威志标準時間 

VOID GetSystemTime( 

LPSYSTEMTIME lpSystemTime // address of system time structure 

); 

函數就可以獲得了,其中LPSYSTEMTIME 是個結構體 

含:年,月,日,周幾,小時,分,秒,毫秒。

GetCurrentTime(),GetLocalTime(),GetSystemTime()之間的差別

1.  GetCurrentTime()

    GetCurrentTime()隻和16位版本的windows相容,在32位windows下最好用gettickcount();

2.  GetLocalTime()

    GetLocalTime()在不同的機器中會有不同的結果,這和你在控制台中的時區設定有關. 該函數是擷取的系統目前所屬時區的時間, 比如說, 在北京時區, 那麼擷取的該時間的時間.

3.  GetSystemTime()

     GetSystemTime()擷取的格林尼治時間, 是全球标準時間.

      SYSTEMTIME stUTC;

      GetSystemTime(&stUTC);

       TCHAR chBuf[nBufSize];

      wsprintf(chBuf,_T("UTC: %u/%u/%u %u:%u:%u:%u %d\r\n"),             

                  stUTC.wYear, stUTC.wMonth, stUTC.wDay,

                  stUTC.wHour, stUTC.wMinute, stUTC.wSecond,

                  stUTC.wMilliseconds,stUTC.wDayOfWeek);

4.  GetTickCount()

     GetTickCount()擷取的是從裝置開機後的毫秒數. 不包括系統的挂起時間.

      主要的應用:

          dwOldTime = GetTickCount();

          DoSomeThing();

          dwTimeElapsed = GetTickCount() - dwOldTime;

      擷取某段程式執行所需的時間.

5. 更好的辦法:“now函數” 

    例如:formatdatetime('yyyy ''年'' m ''月'' d ''日''dddd '+'hh:mm:ssAM/PM',now); 

    輸出結果: 2001年5月8日星期一19:35:40 PM