Windows — 获取系统时间

1、通过 localtime_s() 获取当前时间

1)、包含头文件

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 
#include 
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 

int _tmain(int argc, _TCHAR* argv[])
{
	//计时操作
	clock_t start = clock();			// 开始时间

	//Do Something

	clock_t end = clock();				// 结束时间

	cout << ">>> 耗时: " << end - start << endl;

	return 0;
}

通过这种方式可以获得毫秒级的时间差。 

另一个获取毫秒级别的时间差的函数为GetTickCount()函数,该函数获取的是操作系统从启动到现在经历的时间,示例如下:

#include 
#include 

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 
#include 

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时间片的关系,具体细节不在敖述。

 

 

 

 

你可能感兴趣的:(C/C++,Windows,编程)