如果仅需要得到当前系统时间,则可以使用哪个函数

如果仅需要得到当前系统时间,则可以使用哪个函数,第1张

使用time函数

C语言获取当前系统时间的几种方式:

1 使用time_t time( time_t timer ) 精确到秒

2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒

3 计算时间差使用double difftime( time_t timer1, time_t timer0 )

4 使用DWORD GetTickCount() 精确到毫秒

5 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒

6 要获取高精度时间,可以使用

BOOL QueryPerformanceFrequency(LARGE_INTEGER lpFrequency)

这种问题百度一下到处都是啊。

使用API函数SetLocalTime进行本地时间设置。

先是ParseDateTime,函数原型: BOOL ParseDateTime( LPCTSTR lpszDate, DWORD

dwFlags = 0, LCID lcid = LANG_USER_DEFAULT );

lpszDate就是指定的日期时间了,可以有很多种形式,如: "25 January 1996" "8:30:00" "20:30:00"

"January 25, 1996 8:30:00" "8:30:00 Jan 25, 1996" "1/25/1996 8:30:00"

dwFlags有三种值,LOCALE_NOUSEROVERRIDE、VAR_TIMEVALUEONLY、

VAR_DATEVALUEONLY。LOCALE_NOUSEROVERRIDE是使用系统默认的方式,VAR_TIMEVALUEONLY是忽略日

期,在该选项下,日期会被设置为0,也就是1899年12月30日,在VAR_DATEVALUEONLY下忽略时间,时间被设置为0,即午夜零点。

至于第三个参数lcid,是指定转换方式,语言支持方面的,MSDN里面有个很详细的表,有兴趣可以去看看。

COleDateTime还提供了获取时间的函数,如GetYear()之类的。

注意一下,如果没有指定日期的话,转换后日期就自动变为0,也就是跑1899年去了,这可很危险啊。本来还想偷个懒不指定呢,谁知道怎么偷懒的告诉我一声啊。

SetLocalTime函数的原型: BOOL SetLocalTime( const SYSTEMTIME

lpSystemTime );

输入参数lpSystemTime是一个SYSTEMTIME类型的参数,如果设置成功,返回true,本地时间将会变成lpSystemTime所指定

的时间,否则返回false。看一下SYSTEMTIME的格式: typedef struct _SYSTEMTIME { WORD wYear;

WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD

wSecond; WORD wMilliseconds; } SYSTEMTIME, PSYSTEMTIME; 各成员的含义不用解释了吧。

我们来看一下如何利用SYSTEMTIME结构体和SetLocalTime函数进行本地时间的设置。 SYSTEMTIME st;

stwYear = 2007; stwMonth = 11; stwDay = 24; stwHour = 3; stwMinute =

14; stwSecond = 0; stwMilliseconds = 0; SetSystemTime(&st);

对比一下SYSTEMTIME结构体,可以发现,除wDayOfWeek成员之外,其它各成员都进行赋值了,甚至连wMilliseconds。使用这种

方式进行系统时间设置时,会忽略wDayOfWeek成员,可以不进行该成员的赋值(即使你赋值了也不会被考虑的),但其它所有成员都必须时行赋值,否则

无法成功地进行时间设置。

如果只想对其中的几项进行设置的话,可以先使用GetLocalTime函数来获取当前本地时间,然后再对相应的项进行修改,如下:

SYSTEMTIME st; GetLocalTime(&st); stwHour = 3;

SetLocalTime(&st); 这样的方式比上面方便多了。

上面说到的方法都是对每一项单独进行设置,在VC里面,也提供了一次性设置所有项的方法,使用COleDateTime类。

COleDateTime tm; SYSTEMTIME st; tmParseDateTime("2007-11-24 8:00:00");

tmGetAsSystemTime(st); SetLocalTime(&st); 程序应该很好懂吧,不过有几个注意点要说明一下。

SetLocalTime与SetSystemTime的差别

SetSystemTime的用法与SetLocalTime基本相同,不重复了。差点在于SetSystemTime所带的参数指定的是UTC时间(国

际标准时间),也就是说,像我的电脑里指定的是东八区,这样的话,使用SetSystemTime设置之后,系统的时间,会比参数里所设置的时间快8个小

时。

另外,这两个函数设置的时间,都是对本地机各个系统都有效的。本来很好奇windows系统下改了时间,linux下是不是也会跟着改呢。事实证明是这样

的。

使用COleDateTimeSpan类进行时间的加减。 COleDateTime tm; COleDateTimeSpan ts;

tmParseDateTime("2007-11-24 8:00:00"); tsSetDateTimeSpan(0,8,0,-14);

tm+=ts; SYSTEMTIME st; tmGetAsSystemTime(st); SetLocalTime(&st);

这个程序也很易懂,不说什么了,你只要想清楚了是该加上这个时间差呢还是减去这个时间差就行了,我是经常转不过来啦。

另外,似乎在XP下有权限问题,不是管理员账号的可能不能这样进行修改,这个我没有去试过,谁去试过了跟我说一下吧。

最后补充一句,修改系统时间之后,编译时候容易出问题,最好是每次编译的时候把时间改回来了再重新编译,或者使用rebuild

all,全部重新编译,要不很有可能即使你编译了,而得到的可执行文件还是修改之前的

1、C语言中读取系统时间的函数为time(),其函数原型为:

#include <timeh>

time_t time( time_t ) ;

time_t就是long,函数返回从1970年1月1日(MFC是1899年12月31日)0时0分0秒,到现在的的秒数。

2、C语言还提供了将秒数转换成相应的时间格式的函数:

char ctime(const time_t timer); //将日历时间转换成本地时间,返回转换后的字符串指针 可定义字符串或是字符指针来接收返回值

struct tm gmtime(const time_t timer); //将日历时间转化为世界标准时间(即格林尼治时间),返回结构体指针 可定义struct tm 变量来接收结果

struct tm localtime(const time_t timer); //将日历时间转化为本地时间,返回结构体指针 可定义struct tm 变量来接收结果

3、例程:

#include <timeh>

void main()

{

time_t t;

struct tm pt ;

char pc ;

time(&t);

pc=ctime(&t) ; printf("ctime:%s", pc );

pt=localtime(&t) ; printf("year=%d", pt->tm_year+1900 );

}

//时间结构体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()为负。/

};

看看对你有没有帮助

我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的 *** 作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和 *** 作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍windows下的几种常用时间函数。1:Sleep函数使用:sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux下表示1000秒,Linux下使用毫秒级别的函数可以使用usleep。原理:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。Sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。精度:sleep函数的精度非常低,当系统越忙它精度也就越低,有时候我们休眠1秒,可能3秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级,以及线程的数量等因素。2:MFC下的timer事件 使用:1调用函数SetTimer()设置定时间隔,如SetTimer(0,100,NULL)即为设置100毫秒的时间间隔;2在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的 *** 作。 原理:同sleep函数一样。不同的是timer是一个定时器,可以指定回调函数,默认为OnTimer()函数。 精度:timer事件的精度范围在毫米级别,系统越忙其精度也就越差。3:C语言下的Time 使用:time_t t;time(&t);Time函数是获取当前时间。 原理:time函数主要用于获取当前时间,比如我们做一个电子时钟程序,就可以使用此函数,获取系统当前的时间。 精度:秒级别4:COM对象中的COleDateTime,COleDateTimeSpan类 使用:COleDateTime start_time = COleDateTime::GetCurrentTime();COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;

While(end_timeGetTotalSeconds() < 2)

{

// 处理延时或定时期间能处理其他的消息

DoSomething()

end_time = COleDateTime::GetCurrentTime-start_time;}原理:以上代表延时2秒,而这两秒内我们可以循环调用DoSomething(),从而实现在延时的时候我们也能够处理其他的函数,或者消息。COleDateTime,COleDateTimeSpan是MFC中CTime,CTimeSpan在COM中的应用,所以,上面的方法对于CTime,CTimeSpa同样有效。 精度:秒级别5:C语言下的时钟周期clock() 使用: clock_t start = clock();

Sleep(100);

clock_t end = clock();

double d = (double)(start - end) / CLOCKS_PER_SEC; 原理:clock()是获取计算机启动后的时间间隔。精度:ms级别,对于短时间内的定时或者延时可以达到ms级别,对于时间比较长的定时或者延迟精度还是不够。在windows下CLOCKS_PER_SEC为1000。6:Windows下的GetTickCount()使用: DWORD start = GetTickCount();

Sleep(100);

DWORD end = GetTickCount();原理:GetTickCount()是获取系统启动后的时间间隔。通过进入函数开始定时,到退出函数结束定时,从而可以判断出函数的执行时间,这种时间也并非是函数或者算法的真实执行时间,因为在函数和算法线程不可能一直占用CPU,对于所有判断执行时间的函数都是一样,不过基本上已经很准确,可以通过查询进行定时。GetTickCount()和Clock()函数是向主板BIOS要real time clock时间,会有中断产生,以及延迟问题。精度:WindowsNT 35以及以后版本精度是10ms,它的时间精度比clock函数的要高,GetTickCount()常用于多媒体中。7:Windows下timeGetTime使用:需要包含Mmsystemh,Windowsh,加入静态库WinmmlibtimeBeginPeriod(1);

DWORD start = timeGetTime();

Sleep(100);

DWORD end = timeGetTime();

timeEndPeriod(1);原理:timeGetTime也时常用于多媒体定时器中,可以通过查询进行定时。通过查询进行定时,本身也会影响定时器的定时精度。精度:毫秒,与GetTickCount()相当。但是和GetTickCount相比,timeGetTime可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度, timeBeginPeriod,timeEndPeriod必须成对出现。8:windows下的timeSetEvent使用:还记的VC下的Timer吗?Timer是一个定时器,而以上我们提到几种时间函数或者类型,实现定时功能只能通过轮训来实现,也就是必须另外创建一个线程单独处理,这样会影响定时精度,好在windows提供了内置的定时器timeSetEvent,函数原型为MMRESULT timeSetEvent( UINT uDelay, //以毫秒指定事件的周期

UINT uResolution, //以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms

LPTIMECALLBACK lpTimeProc, //指向一个回调函数

WORD dwUser, //存放用户提供的回调数据

UINT fuEvent )// 标志参数,TIME_ONESHOT:执行一次;TIME_PERIODIC:周期性执行 具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在 lpFunction回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。原理:可以理解为代回调函数的timeGetTime精度:毫秒,timeSetEvent可以通过timeBeginPeriod,timeEndPeriod设置定时器的最小解析精度, timeBeginPeriod,timeEndPeriod必须成对出现。

9:高精度时控函数QueryPerformanceFrequency,QueryPerformanceCounter使用:LARGE_INTEGER m_nFreq;

LARGE_INTEGER m_nBeginTime;

LARGE_INTEGER nEndTime;

QueryPerformanceFrequency(&m_nFreq); // 获取时钟周期

QueryPerformanceCounter(&m_nBeginTime); // 获取时钟计数

Sleep(100);

QueryPerformanceCounter(&nEndTime);

cout << (nEndTimeQuadPart-m_nBeginTimeQuadPart)1000/m_nFreqQuadPart << endl;原理:CPU上也有一个计数器,以机器的clock为单位,可以通过rdtsc读取,而不用中断,因此其精度与系统时间相当。精度:计算机获取硬件支持,精度比较高,可以通过它判断其他时间函数的精度范围。10小结:以上提到常用的9种时间函数,由于他们的用处不同,所以他们的精度也不尽相同,所以如果简单的延时可以用sleep函数,稍微准确的延时可以使用clock函数,GetTickCount函数,更高级的实用timeGetTime函数;简单的定时事件可以用Timer,准确地可以用timeSetEvent;或取一般系统时间可以通time,或者CTime,或者COleDateTime,获取准确的时间可以用clock,或者GetTickCount函数,或者timeGetTime函数,而获取准确地系统时间要使用硬件支持的QueryPerformanceFrequency函数,QueryPerformanceCounter函数。

首先可以用系统给我们提供的一个定时器,即楼上所说的,用SetTimer去启动一个定时器,然后在OnTimer函数里面,使用API函数GetSystemTime获取当前时间,与你设定的值进行对比,如果符合你设定的值,则让它执行相应的功能,并用KillTimer终止定时器,如有什么不明白的,可以继续追问~~

没有现成的类似函数,也不可能有。

想在指定时间内执行某个动作,如果动作时间很短则没有问题。如果动作时间很长,系统也不会停止这个动作(因为可能会产生不可预料的结果,比如内存泄漏,文件写一半等等)。

所以,设计的时候,不是考虑在指定时间内完成某个动作,而是要考虑某个动作的执行时间不要超长。

如果你的程序比较简单,不需要考虑什么正确设计的话,你可以做一个背景线程去执行这个动作,主线程判断超时后再kill掉背景线程。

// 头文件中添加

CMonthCalCtrl m_calendar;

// DoDataExchange(CDataExchange pDX)中添加

DDX_Control(pDX, IDC_CALENDAR, m_calendar);

// 以下是MCN_SELCHANGE消息响应函数

void CCalendarDemoDlg::OnSelchangeCalendar(NMHDR pNMHDR, LRESULT pResult)

{

//获取控件当前所选日期

SYSTEMTIME st = {0};

m_calendarGetCurSel(&st);

//清空小时、分钟等成员,否则在后续计算中将得到错误的结果

stwHour = stwMinute = stwSecond = stwMilliseconds = 0;

//得到当年的1月1日

CTime timeBegin(stwYear, 1, 1, 0, 0, 0);

//得当所选日期和该年1月1日的差值

CTime timeSel(st);

CTimeSpan ts = timeSel - timeBegin;

//根据差值得到日期数

TCHAR szOutput[128] = {0};

_stprintf(szOutput, _T("%d年%d月%d日是%d年的第%d天。"),

timeSelGetYear(), timeSelGetMonth(), timeSelGetDay(),

timeSelGetYear(), tsGetDays() + 1);

//输出结果

SetDlgItemText(IDC_OUTPUT, szOutput);

pResult = 0;

}

// 附加真实图

以上就是关于如果仅需要得到当前系统时间,则可以使用哪个函数全部的内容,包括:如果仅需要得到当前系统时间,则可以使用哪个函数、如何通过mfc应用程序修改系统时间的菜单选项就电脑右下角右键点击系统时间时d出的菜单。。。100分送上、获取时间的C C++函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9637365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存