1、通過 localtime_s() 獲取當前時間
1)、包含頭文件<time.h>
2)、定義兩個變量:
time_t tt;
struct tm pTM;
3)、獲取時間:
time(&tt);
4)、轉換爲本地時間:
localtime_s(&pTm, &tt);
5)、格式化顯示時間:
sprintf(str, "時%d:分%d:秒%d", pTm.tm_hour, pTm.tm_min,pTm.tm_sec);
也可以採用以下方式格式化顯示時間:
char timestr[100];
strftime(timestr, sizeof(timestr), "%H:%M:%S", &pTm);
程序示例如下:
#include "stdafx.h"
#include <time.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
time_t ti_t;
struct tm s_tm;
time(&ti_t);
localtime_s(&s_tm, &ti_t);
char time_chr[64] = {0};
sprintf(time_chr, "%d-%d-%d %d:%d:%d", s_tm.tm_year+1900, s_tm.tm_mon+1, s_tm.tm_mday, s_tm.tm_hour, s_tm.tm_min, s_tm.tm_sec);
cout << time_chr << endl;
return 0;
}
之所以要對得到的時間進行處理,是因爲struct tm的結構所決定的,struct tm的定義及元素屬性如下所示:
struct tm
{
int tm_sec; /* 秒 – 取值區間爲[0,59] */
int tm_min; /* 分 - 取值區間爲[0,59] */
int tm_hour; /* 時 - 取值區間爲[0,23] */
int tm_mday; /* 一個月中的日期 - 取值區間爲[1,31] */
int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區間爲[0,11] */
int tm_year; /* 年份,其值等於實際年份減去1900 */
int tm_wday; /* 星期 – 取值區間爲[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; /* 從每年的1月1日開始的天數 – 取值區間爲[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst爲正。不實行夏令時的時候,tm_isdst爲0;不瞭解情況時,tm_isdst()爲負。
long int tm_gmtoff; /*指定了日期變更線東面時區中UTC東部時區正秒數或UTC西部時區的負秒數*/
const char *tm_zone; /*當前時區的名字(與環境變量TZ有關)*/
};
2、通過 clock() 計算時間差
計算時間差可以參考如下所示示例:
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
//計時操作
clock_t start = clock(); // 開始時間
//Do Something
clock_t end = clock(); // 結束時間
cout << ">>> 耗時: " << end - start << endl;
return 0;
}
通過這種方式可以獲得毫秒級的時間差。
另一個獲取毫秒級別的時間差的函數爲GetTickCount()函數,該函數獲取的是操作系統從啓動到現在經歷的時間,示例如下:
#include <Windows.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD start = GetTickCount();
Sleep(1000);
DWORD end = GetTickCount();
double period = (double)(end - start);
getchar();
}
3、通過QueryPerformanceCounter計算時間差
前面的通過clock()的方式只能獲取毫秒級別的時間差,如果想獲得微秒級別的該怎麼辦呢?可以使用QueryPerformanceCounter函數。QueryPerformanceCounter函數獲取的直接是CPU的時間,能夠精確到微秒級。程序示例如下:
#include <Windows.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
LARGE_INTEGER nFreq;
LARGE_INTEGER t1;
LARGE_INTEGER t2;
double dt;
int i = 0;
int loop_i = 100;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&t2);
while(i < loop_i)
{
//Sleep(1);
QueryPerformanceCounter(&t1);
dt = (double)(t1.QuadPart - t2.QuadPart) / (double)nFreq.QuadPart;
t2 = t1;
printf(">>> Running Time:%lf ms\n", dt * 1000);
i++;
}
getchar();
}
該示例可以計算每一次while循環耗費多長時間;
需要注意的是,當在while循環中加入 Sleep(1);//休眠1ms ;計算出的時間差並不是1ms,而是15ms左右,這個是因爲CPU時間片的關係,具體細節不在敖述。