cocos2dx 获取网络时间

原创 2015年11月18日 18:11:53

一般消除游戏都有体力回复的功能,很多消除游戏都是取的本地时间,这样的坏处就是用户修改了手机的时间就可以回复满体力。

实现代码如下 :

思路就是使用百度的时间api获取到网页,然后在网页中抓取到时间戳 查看网页的源代码就可以发现源代码中有一个

window.baidu_time(1447841230045); 这一串数字就是时间戳 这里我们只要精确到秒级所以取前面10位就可以。

抓取时间戳就是通过window.baidu_time(关键字把网页源代码字符串切割成两半 然后取后面一半的前面10个字符,再把字符串转换为时间就可以了。

#ifndef __NETTIME__H
#define __NETTIME__H

#include "cocos2d.h";
#include "network/HttpClient.h"
using namespace cocos2d;
using namespace network;

class NetTime : public Node
{
public:
	NetTime();
	~NetTime();
	CREATE_FUNC(NetTime);
	
	CC_SYNTHESIZE(int, m_day,Day);
	CC_SYNTHESIZE(int, m_moth, Month);
	CC_SYNTHESIZE(int, m_year, Year);
	CC_SYNTHESIZE(int, m_hour, Hour);
	CC_SYNTHESIZE(int, m_second, Second);
	CC_SYNTHESIZE(int, m_minute, Minute);
	CC_SYNTHESIZE(time_t, m_time, Time);//时间chuo

	void requestNetTime();
	
private:
	void onHttpComplete(HttpClient * sender, HttpResponse * response);
	void spliteTime(std::string htmlStr);
	void initTime(time_t time);
};


#endif

#include "NetTime.h"
#include "Utils.h"

NetTime::NetTime() :m_second(0), m_day(0), m_hour(0), m_year(0), m_minute(0), m_moth(0)
{

}

NetTime::~NetTime()
{

}

void NetTime::requestNetTime()
{
	HttpRequest * request = new HttpRequest();
	request->setUrl("http://open.baidu.com/special/time/"); //百度获取时间的api
	
	request->setRequestType(HttpRequest::Type::GET);
	request->setTag("WebTime");
	request->setResponseCallback(this, httpresponse_selector(NetTime::onHttpComplete));
	HttpClient::getInstance()->send(request);
}

void NetTime::onHttpComplete(HttpClient * sender, HttpResponse * response)
{
	if (!response)
		return;

	if (0 != strlen(response->getHttpRequest()->getTag()))
	{
		CCLOG("%s completed", response->getHttpRequest()->getTag());
	}
	int statusCode = response->getResponseCode();
	char statusString[64] = {};
	sprintf(statusString, "HTTP Status: %d, tag = %s", statusCode, response->getHttpRequest()->getTag());
	CCLOG("%s", statusString);
	if (!response->isSucceed())
	{
		CCLOG("response failed");
		CCLOG("error buffer:%s", response->getErrorBuffer());
		return;
	}
	std::vector<char> * buffer = response->getResponseData();
	std::string str;
	for (unsigned i = 0; i < buffer->size(); i++)
	{
		char a = (*buffer)[i];
		str.append(1, a);
	}
	
	spliteTime(str);
	//readJson(str);
}

void NetTime::spliteTime(std::string htmlStr)
{
	std::vector<std::string> tmp;
	splitString(tmp, htmlStr, "baidu_time(");

	std::string str = tmp.at(1);
	std::string tmpTime = str.substr(0,10) ;
	time_t tt = atoi(tmpTime.c_str());  
	initTime(tt);
}

void NetTime::initTime(time_t time)
{
	time_t t;
	struct tm *p;
	t = time;
	p = localtime(&t);
	/*char s[100];
	strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", p);
	printf("%d: %s\n", (int)t, s);*/

	setSecond(p->tm_sec);
	setDay(p->tm_mday);
	setMonth(p->tm_mon + 1);
	setYear(p->tm_year + 1900 );
	setMinute(p->tm_min);
	setHour(p->tm_hour + 8);//北京时间等于世界时间加8小时
	setTime(t);
}


切割字符串函数

//切割字符串
static void splitString(std::vector<std::string> &contentVector,std::string content, std::string pattern)
{
	std::string::size_type pos;
	//std::vector<std::string> result;  
	content += pattern;//扩展字符串以方便操作  
	int size = content.size();

	for (int i = 0; i<size; i++)
	{
		pos = content.find(pattern, i);
		if (pos<size)
		{
			std::string s = content.substr(i, pos - i);
			// result.push_back(s);  
			contentVector.push_back(s);
			i = pos + pattern.size() - 1;
		}
	}
}



cocos2dx 获取当前时间

之前使用过cocos2d-x获取系统时间,毫秒级的 [cpp] view plaincopy long getCurrentTime()      ...
  • u013340181
  • u013340181
  • 2014年05月23日 13:59
  • 5670

cocos2dx通过http获取网络时间校对

链接地址: http://free.timeanddate.com/ts.php?t=1447666887520
  • zszeng
  • zszeng
  • 2015年11月16日 17:42
  • 815

cocos获取网络时间和系统时间(完美)

访问百度的时间api获取到网页,新建MyTime类,继承自CCNode并重写init()方法。然后引入CCHttpClient和rapidjson需要的头文件,使用CCHttpClient进行网络时间...
  • fuyongsheng135
  • fuyongsheng135
  • 2016年11月06日 20:10
  • 1099

cocos2dx 获取当前时间

之前使用过cocos2d-x获取系统时间,毫秒级的 [cpp] view plaincopy long getCurrentTime()      ...
  • u013340181
  • u013340181
  • 2014年05月23日 13:59
  • 5670

Cocos2d-x 获取系统当前时间

在项目中我们常常需要获取系统当前时间,用作随机数的种子或者将当前时间显示到画面中。 在标准C/C++中,我们通常使用tm结构实现对系统当前时间的获取。头文件time.h中定义如下:在标准C/C++中...
  • 24_hour
  • 24_hour
  • 2015年09月18日 21:57
  • 1966

cocos2dx 获取网络图片并创建精灵显示到界面上

void MatchCellBig::initHttpInfo(void) { CCHttpClient* httpClient = CCHttpClient::getInstance(); ...
  • Jff316948714
  • Jff316948714
  • 2014年05月12日 16:30
  • 1129

【总结】Cocos2d-x实用方法整理

本篇整理学习过程中用到的一些小技巧,以便之后使用,后续不断补充。
  • ldpjay
  • ldpjay
  • 2015年07月21日 15:04
  • 2146

如何获取网络时间

最近需要写一个平时用的小工具,其中有需要获取网络时间的需求,第一次写,还是记录下来,分享出去; 程序很简单,直接上代码嘛~ ok,你可以定义一个这样的ip数组用于时间服务器的轮询,ip是从网上找的~ ...
  • ivan_b
  • ivan_b
  • 2015年11月06日 18:39
  • 819

获取网络时间

这两天有一个应用需要获取网络时间,虽然一直知道可以从时间服务器获取时间,却从来也没有操作过,借这个机会重新进行一下深入了了解。 基本的思路就是:通过SOCKET连接时间服务器,直接接收从服务器发送的过...
  • skywalker_leo
  • skywalker_leo
  • 2014年10月15日 10:52
  • 7350

获取网络时间(国家标准时间)

我们在开发中,很多应用需要读取网络时间来作为一个时间的标准,对业务逻辑进行相对可靠的校验。 下面是Java中(Android一样)读取网络时间的代码:package com.test;import ...
  • catoop
  • catoop
  • 2015年11月27日 23:45
  • 25152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx 获取网络时间
举报原因:
原因补充:

(最多只允许输入30个字)