获取本地时间和网络时间

游戏中通常都会有根据时间来恢复体力值的设定,但是如果是本地时间的话,玩家可以通过修改本地时间的作弊行为来达到迅速恢复体力的目的。RT,我们便需要根据网络时间来进行判定。

1、获取本地时
Ps:别忘了添加需要的头文件

void getLocationTime()
{
    struct tm *tm;
    time_t timep;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
    time(&timep);
#else
    struct timeval tv;
    gettimeofday(&tv,NULL);
    timep = tv.tv_sec;
#endif

    tm = localtime(&timep);
    int year = tm->tm_year + 1900;
    int month = tm->tm_mon + 1;
    int day = tm->tm_mday;
    int hour=tm->tm_hour;
    int minute=tm->tm_min;
    int second=tm->tm_sec;
    std::cout << "当前日期:" << year << "-" << month << "-" << day << std::endl;
    std::cout << "当前时间:" << hour << ":" << minute << ":" << second << std::endl;
}

2、获取网络时间
这里是利用百度的时间url来获取网络时间

直接上代码:
NetTime.h

#define __NETTIME_H___
#ifdef __NETTIME_H___

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

class NetTime : public Node
{
public:
    NetTime();
    ~NetTime();
    CREATE_FUNC(NetTime);

    CC_SYNTHESIZE(int, nDay, Day);
    CC_SYNTHESIZE(int, nMonth, Month);
    CC_SYNTHESIZE(int, nYear, Year);
    CC_SYNTHESIZE(int, nHour, Hour);
    CC_SYNTHESIZE(int, nMinute, Minute);
    CC_SYNTHESIZE(int, nSecond, Second);
    CC_SYNTHESIZE(time_t, tTime, Time);

    void onRequestTime();

    static void splitString(std::vector<std::string> &contentVector, std::string content, std::string pattern);

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

    static NetTime* getInstance();
    static NetTime* pInstance;

};

#endif

NetTime.cpp


#include "NetTime.h"

NetTime* NetTime::pInstance = NULL;

NetTime::NetTime() : nDay(0), nMonth(0), nYear(0), nHour(0), nMinute(0), nSecond(0)
{
}

NetTime::~NetTime()
{
}


void NetTime::onRequestTime()
{
    HttpRequest* request = new HttpRequest();
    request->setUrl("http://open.baidu.com/special/time/");//baidu getNetTime api
    request->setRequestType(HttpRequest::Type::GET);
    request->setTag("getNetTime");
    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_s(statusString, "HTTP Status : %d, tag = %s", statusCode, response->getHttpRequest()->getTag());
    CCLOG("%s", statusString);

    if (!response->isSucceed())
    {
        CCLOG(" response failed !");
        CCLOG(" error buffer is :%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);
}

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

    std::string str = tmp.at(2);
    std::string tmpTime = str.substr(1, 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);

    setSecond(p->tm_sec);
    setMinute(p->tm_min);
    setHour(p->tm_hour);
    setDay(p->tm_mday);
    setMonth(p->tm_mon + 1);
    setYear(p->tm_year + 1900);

    setTime(t);
    log("time is : %d-%d-%d %d:%d:%d", getYear(), getMonth(), getDay(), getHour(), getMinute(), getSecond());
}

//切割字符串
void NetTime::splitString(std::vector<std::string> &contentVector, std::string content, std::string pattern){
    std::string::size_type pos;
    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);
            contentVector.push_back(s);
            i = pos + pattern.size() - 1;
        }
    }
}

NetTime* NetTime::getInstance()
{
    if (pInstance == NULL)
    {
        pInstance = new NetTime;
    }
    return pInstance;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值