/************************************************************************ 系统:windows XP 工具:VS2008 ************************************************************************/ #include <stdio.h> #include <iostream> #include <Windows.h> #include <time.h> #include <string> using namespace std; void IntToDate1(time_t tm,string &); void IntToDate2(time_t tm,string &); void GetSysTime(string &tmp_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-11*/ int tm_year; /*自1900的年数*/ int tm_wday; /*自星期日的天数0-6*/ int tm_yday; /*自1月1日起的天数,0-365*/ int tm_isdst; /*是否采用夏时制,采用为正数* } 在VC++中,我们可以借助CTime时间类,获取系统当前日期: CTime t = CTime::GetCurrentTime(); //获取系统日期 int d=t.GetDay(); //获得几号 int y=t.GetYear(); //获取年份 int m=t.GetMonth(); //获取当前月份 int h=t.GetHour(); //获取当前为几时 int mm=t.GetMinute(); //获取分钟 int s=t.GetSecond(); //获取秒 int w=t.GetDayOfWeek(); //获取星期几,注意1为星期天,7为星期六 1 使用time_t time( time_t * timer ) 精确到秒 计算时间差使用double difftime( time_t timer1, time_t timer0 ) 2 使用clock_t clock() 得到的是CPU时间 精确到1/CLOCKS_PER_SEC秒 3 使用DWORD GetTickCount() 得到的是系统运行的时间 精确到毫秒 4 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒 5 要获取高精度时间,可以使用 BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率 BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值 然后用两次计数器的差除以Frequency就得到时间。 6 还有David的文章中提到的方法: Multimedia Timer Functions The following functions are used with multimedia timers. timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime timeGetTime/timeKillEvent/TimeProc/timeSetEvent 精度很高 Q:GetTickCount()函数,说是毫秒记数,是真的吗,还是精确到55毫秒? A: GetTickCount()和GetCurrentTime()都只精确到55ms(1个tick就是55ms)。如果要精确到毫秒, 应该使用timeGetTime函数或QueryPerformanceCounter函数。具体例子可以参考QA001022 "VC++中使用高精度定时器"、QA001813 "如何在Windows实现准确的定时"和QA004842 "timeGetTime函数延时不准"。 Q:vc++怎样获取系统时间,返回值是什么类型的变量呢? GetSystemTime返回的是格林威志标准时间 GetLocalTime,和上面用法一样,返回的是你所在地区的时间,中国返回的是北京时间 VOID GetSystemTime( LPSYSTEMTIME lpSystemTime // address of system time structure ); 函数就可以获得了,其中LPSYSTEMTIME 是个结构体 含:年,月,日,周几,小时,分,秒,毫秒。 */ int main(int argc, char **argv) { time_t t = 1253683761; cout << "两者时间相隔的秒数:" << difftime(time(NULL), t) << endl; string time_tmp; IntToDate1(t, time_tmp); cout << time_tmp << endl; time_tmp = ""; IntToDate2(t, time_tmp); cout << time_tmp << endl; time_tmp = ""; GetSysTime(time_tmp); cout << time_tmp << endl; time_tmp = ""; time_t temp = time(NULL); t=temp; IntToDate1(t, time_tmp); cout << time_tmp << endl; return 0; } /************************************************************************/ /* 第一种方式:根据指定的数字输出对应的时间 */ /* date: 2009-06-03 */ /* auth: xgq */ /************************************************************************/ void IntToDate1(time_t tm, string &tmp_tm) { time_t t = tm; struct tm tm1 = *localtime(&t); char tmp[40]; sprintf( tmp, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", 1900+tm1.tm_year, / tm1.tm_mon+1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, tm1.tm_sec ); tmp_tm = tmp; } /************************************************************************/ /* 第二种方式:使用系统函数 */ /* size_t strftime(char *strDest, size_t maxsize, const char *format, */ /* const struct tm *timeptr); */ /* 根据格式字符串生成字符串。 */ /* struct tm *localtime(const time_t *timer); */ /* 取得当地时间,localtime获取的结果由结构tm返回 */ /* 返回的字符串可以依下列的格式而定: */ /* %a 星期几的缩写。Eg:Tue */ /* %A 星期几的全名。 Eg: Tuesday */ /* %b 月份名称的缩写。 */ /* %B 月份名称的全名。 */ /* %c 本地端日期时间较佳表示字符串。 */ /* %d 用数字表示本月的第几天 (范围为 00 至 31)。日期 */ /* %H 用 24 小时制数字表示小时数 (范围为 00 至 23)。 */ /* %I 用 12 小时制数字表示小时数 (范围为 01 至 12)。 */ /* %j 以数字表示当年度的第几天 (范围为 001 至 366)。 */ /* %m 月份的数字 (范围由 1 至 12)。 */ /* %M 分钟。 */ /* %p 以 ''AM'' 或 ''PM'' 表示本地端时间。 */ /* %S 秒数。 */ /* %U 数字表示为本年度的第几周,第一个星期由第一个周日开始。 */ /* %W 数字表示为本年度的第几周,第一个星期由第一个周一开始。 */ /* %w 用数字表示本周的第几天 ( 0 为周日)。 */ /* %x 不含时间的日期表示法。 */ /* %X 不含日期的时间表示法。 Eg: 15:26:30 */ /* %y 二位数字表示年份 (范围由 00 至 99)。 */ /* %Y 完整的年份数字表示,即四位数。 Eg:2008 */ /* %Z(%z) 时区或名称缩写。Eg:中国标准时间 */ /* %% % 字符。 */ /* date: 2009-06-03 */ /* auth: xgq */ /************************************************************************/ void IntToDate2(time_t tm, string &tmp_tm) { time_t t = tm; char tmp[64]; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) ); tmp_tm = tmp; } /************************************************************************/ /* 第三种方式:使用window系统API获取毫秒级的时间 */ /* date: 2009-06-03 */ /* auth: xgq */ /************************************************************************/ void GetSysTime(string &tmp_tm) { SYSTEMTIME sys; GetLocalTime( &sys ); char tmp[64]; sprintf(tmp, "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d/n",sys.wYear,sys.wMonth,/ sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek); tmp_tm = tmp; }