Windows — 獲取系統時間

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時間片的關係,具體細節不在敖述。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章