bool CUpdateStartUpDlg::CampareLastWriteTime(CString FilePath,CString VersionTime)
{
CString FileName=FilePath;
CFileFind finder;
bool bExist=finderFindFile(FilePath);
if(bExist==false)
{
return true;//当查找不到文件时 直接下载
}
WIN32_FIND_DATA localFile;
HANDLE hFile=FindFirstFile(FileName,&localFile);
//去除本地文件时间的秒和微秒
SYSTEMTIME SystemTime;
::FileTimeToSystemTime(&localFileftLastWriteTime,&SystemTime);
SystemTimewSecond=0;
SystemTimewMilliseconds=0;
SystemTimewHour+=8;
FILETIME fileTimeLocal;
::SystemTimeToFileTime(&SystemTime,&fileTimeLocal);
//配置文件读取的时间
FILETIME fileTimeVersion;
COleDateTime dt;
SYSTEMTIME st={0};
dtParseDateTime(VersionTime);
dtGetAsSystemTime(st);
if(stwYear==0)
{
return false;
}
::SystemTimeToFileTime(&st,&fileTimeVersion);
//时间比较:-1为第一个时间早,0相等,1为第一个时间晚于第二个时间
LONG lRet = CompareFileTime(&fileTimeLocal,&fileTimeVersion);
if(lRet==-1)
{
return true;//当本地文件最后修改时间比配置文件所取时间小 则返回true 相等则返回false
}
return false;
}
这是我以前写的一段代码 希望能帮助到你
CompareFileTime(&fileTimeLocal,&fileTimeVersion);
这种问题百度一下到处都是啊。
使用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,全部重新编译,要不很有可能即使你编译了,而得到的可执行文件还是修改之前的
CTime类
时间类,可以这样初始化:CTime t(1999, 3, 19, 22, 15, 0); // 10:15 PM March 19, 1999
有函数 static CTime GetCurrentTime(),获取当前时间;
CString Format("%H:%M:%S"):用来格式化得到的CTime,参数可以是A(星期几),B(月份),d(日期),Y(年份),HMS(时分秒);
下面是例子:
CTime T=CTime::GetCurrentTime();
CString str=TFormat("%H:%M:%S");
AfxMessageBox(str);
看看对你有没有帮助
我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的 *** 作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和 *** 作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍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函数。
您好,我在别的论坛也看到您的问题,很高兴为您解答:
GetYear返回该COleDateTime对象代表的年
GetMonth返回该COleDateTime对象代表的月(1-12)
GetDay返回该COleDateTime对象代表的日(1-31)
GetHour返回该COleDateTime对象代表的时(0-23)
GetMinute返回该COleDateTime对象代表的分(0-59)
GetSecond返回该COleDateTime对象代表的秒(0-59)
GetDayOfWeek返回该COleDateTime对象代表的该天是星期几(星期日=1)
GetDayOfYear返回该COleDateTime对象代表的该天是年内第几天(1月1日=1)
COleDateTime time;
time = COleDateTime::GetCurrentTime();
CString str;
strFormat(TEXT("%04d-%02d-%02d"),timeGetYear(),timeGetMonth(),timeGetDay());
MessageBox(strGetBuffer());
如果我的回答没能帮助您,请继续追问。
以上就是关于C++怎么取当前时间和设定时间做比较全部的内容,包括:C++怎么取当前时间和设定时间做比较、如何通过mfc应用程序修改系统时间的菜单选项就电脑右下角右键点击系统时间时d出的菜单。。。100分送上、C/C++日期问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)