cocos2d-x获取系统时间 CCTime::gettimeofdayCocos2d

欢迎转载,本帖地址:http://blog.csdn.net/jinjian2009/article/details/9449585

之前使用过cocos2d-x获取系统时间,毫秒级的

[cpp]  view plain copy
  1. long getCurrentTime()     
  2. {      
  3.     struct timeval tv;      
  4.     gettimeofday(&tv,NULL);      
  5.     return tv.tv_sec * 1000 + tv.tv_usec / 1000;      
  6. }    

或者这样写

[cpp]  view plain copy
  1. long getCurrentTime()     
  2. {      
  3.     struct cc_timeval tv;      
  4.     CCTime::gettimeofdayCocos2d(&tv, NULL);   
  5.     return tv.tv_sec * 1000 + tv.tv_usec / 1000;      
  6. }    


上面两种实现应该都是没有问题的~~~之前获取时间的主要作用是给随机函数做种子,或者计算FPS,或者作为自己的定时器使用~这些都没有问题

后来有项目需要获取年月日等时间,这些怎么来计算呢?

[cpp]  view plain copy
  1. void GetTime()  
  2. {  
  3.     struct cc_timeval now;   
  4.     CCTime::gettimeofdayCocos2d(&now, NULL);   
  5.   
  6.     struct tm *tm;  
  7.     time_t timep = now.tv_sec;  
  8.     tm = localtime(&timep);  
  9.     int year = tm->tm_year + 1900;  
  10.     int month = tm->tm_mon + 1;  
  11.     int day = tm->tm_mday;  
  12.     int hour=tm->tm_hour;  
  13.     int min=tm->tm_min;  
  14.     int second=tm->tm_sec;  
  15. }  


这样可以获取年月日时分秒

但是本人在win32上获取的年月日是1970-1-1,时分秒也是不对的,本人使用的是cocos2d-x2.1.3版本

debug发现CCTime::gettimeofdayCocos2d(&now, NULL); 该方法获取的now.tv_sec数据很短,转换下也就几个小时,

找到CCTime::gettimeofdayCocos2d方法的实现,发现也是调用了gettimeofday这个方法

继续找,发现win32平台下的该方法的实现

[cpp]  view plain copy
  1. int gettimeofday(struct timeval * val, struct timezone *)  
  2. {  
  3.     if (val)  
  4.     {  
  5.         LARGE_INTEGER liTime, liFreq;  
  6.         QueryPerformanceFrequency( &liFreq );  
  7.         QueryPerformanceCounter( &liTime );  
  8.         val->tv_sec     = (long)( liTime.QuadPart / liFreq.QuadPart );  
  9.         val->tv_usec    = (long)( liTime.QuadPart * 1000000.0 / liFreq.QuadPart - val->tv_sec * 1000000.0 );  
  10.     }  
  11.     return 0;  
  12. }  


网上搜了下,原来是cocos2d-x官方论坛里有人修改过该方法,帖子地址:http://www.cocos2d-x.org/boards/6/topics/8191

代码如下

@@ -30,20 +30,11 @@ int CC_DLL gettimeofday(struct timeval * val, struct timezone *)
 {
     if (val)
     {
-        SYSTEMTIME wtm;
-        GetLocalTime(&wtm);
-
-        struct tm tTm;
-        tTm.tm_year     = wtm.wYear - 1900;
-        tTm.tm_mon      = wtm.wMonth - 1;
-        tTm.tm_mday     = wtm.wDay;
-        tTm.tm_hour     = wtm.wHour;
-        tTm.tm_min      = wtm.wMinute;
-        tTm.tm_sec      = wtm.wSecond;
-        tTm.tm_isdst    = -1;
-
-        val->tv_sec     = (long)mktime(&tTm);       // time_t is 64-bit on win32
-        val->tv_usec    = wtm.wMilliseconds * 1000;
+        LARGE_INTEGER liTime, liFreq;
+        QueryPerformanceFrequency( &liFreq );
+        QueryPerformanceCounter( &liTime );
+        val->tv_sec     = (long)( liTime.QuadPart / liFreq.QuadPart );
+        val->tv_usec    = (long)( liTime.QuadPart * 1000000.0 / liFreq.QuadPart - val->tv_sec * 1000000.0 );
     }
     return 0;
 }

可以发现以前该方法的实现是使用了GetLocalTime来获取本地时间,然后进行计算的,如果按照这样的实现方法,本人之前写的GetTime()方法应该能获取到正确的年月日时分秒,但是上述代码为了使获取的时间更为精确,使用了

 QueryPerformanceFrequency( &liFreq );
 QueryPerformanceCounter( &liTime );

两个方法,QueryPerformanceCounter( &liTime );这个方法,是计算CPU运行到现在的时间,所以很明显本人获取的时间是开机到现在的时间,本人计算了下,还真是差不多~

所以可以理解,win32下gettimeofday方法的实现被官方这么修改过之后是不能获取到准确的年月日时分秒的

如果要获取准确的数据,可以使用以下方法

[cpp]  view plain copy
  1. void GetTime(int level)  
  2. {  
  3.     struct tm *tm;  
  4.     time_t timep;  
  5. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  6.     time(&timep);  
  7. #else  
  8.     struct cc_timeval now;   
  9.     CCTime::gettimeofdayCocos2d(&now, NULL);   
  10.     timep = now.tv_sec;  
  11. #endif  
  12.   
  13.   
  14.     tm = localtime(&timep);  
  15.     int year = tm->tm_year + 1900;  
  16.     int month = tm->tm_mon + 1;  
  17.     int day = tm->tm_mday;  
  18.     int hour=tm->tm_hour;  
  19.     int min=tm->tm_min;  
  20.     int second=tm->tm_sec;  
  21. }  


这回win32平台上OK了,至于其他平台上有没有问题,要测试下~

欢迎转载,本帖地址:http://blog.csdn.net/jinjian2009/article/details/9449585

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值