Andy Niu �����ĵ�

Andy Niu

Andy Niu Help  1.0.0.0
CPP常用方法

变量

 GetNowTimeAsString
 
 时间字符串与unix时间戳的转化
 
 设置系统时间
 
 int与枚举的转化
 
 VS中string实现的小秘密
 

详细描述

变量说明

GetNowTimeAsString
// 字符串表示的当前时间
string NzbUtils::GetNowTimeAsString()
{
    char buf[64] = {0};
    time_t now = time(NULL);
    //方法1:
    /*tm* ptm = localtime(&now);
    sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", 
        ptm->tm_year+1900, 
        ptm->tm_mon+1, 
        ptm->tm_mday,
        ptm->tm_hour,
        ptm->tm_min, 
        ptm->tm_sec);*/

    //方法2:
    strftime(buf, 64, "%Y-%m-%d %H:%M:%S",localtime(&now));
    return buf;
}
int与枚举的转化
1、int范围比枚举大,从枚举到int一般没有问题,不会超出范围。
2、但是从int到枚举,强制转化,有可能会出现问题。
    如果int是个有效的枚举值,没有问题。
    如果int是个无效的枚举值,枚举取值为真实的int值。
enum Male
{
    Man,
    Woman,
};
int main(int argc, char* argv[])
{
    Male a = (Male)(0);     // a取值为Man
    Male b = (Male)(2);     // 无效的枚举值,b取值为真实的int值,也就是2
}
VS中string实现的小秘密
1、string的大小是32个字节。
2、当string的内容不超过16个字节的时候,string的内容就放在string本身的内存上。
3、当string的内容超过16个字节(加上\0)的时候,string的内容会放在其他内存,string中有个指针关联那块内存。
4、测试代码如下:
    int main()
    {
        string aa;
        int d = sizeof(aa);
        string* ps = &aa;
    
        // 使用内存窗口,观察ps
        aa = "123456781234567";  // 16个字节(包含\0),分配至string本身上
        aa = "1234567812345678"; // 17个字节(包含\0),分配其他内存,里面有个指针关联
        return 0;
    }
时间字符串与unix时间戳的转化
// 由"2016-09-06 14:18:16" 得到 1473142696
int NzbUtils::GetUnixTimeStamp(const string& timeStr)
{
    char year[5] = {0};
    char month[3] = {0};
    char day[3] = {0};
    char hour[3] = {0};
    char min[3] = {0};
    char sec[3] = {0};

    if(sscanf(timeStr.c_str(), "%4c-%2c-%2c %2c:%2c:%2c", year,month,day,hour,min,sec) != 6)
    {
        return -1;
    }

    struct tm tmLocal = {0};
    tmLocal.tm_year = atoi(year) - 1900;
    tmLocal.tm_mon = atoi(month) -1;
    tmLocal.tm_mday = atoi(day);
    tmLocal.tm_hour = atoi(hour);
    tmLocal.tm_min = atoi(min);
    tmLocal.tm_sec = atoi(sec);

    return (int)mktime(&tmLocal);
}

// 由1473142696 得到 "2016-09-06 14:18:16"
string NzbUtils::GetTimeStr(int unixTimeStamp)
{
    char buf[64] = {0};
    time_t now = (time_t)(unixTimeStamp);
    //方法1:
    //tm* ptm = localtime(&now);
    //sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", 
    //  ptm->tm_year+1900, 
    //  ptm->tm_mon+1, 
    //  ptm->tm_mday,
    //  ptm->tm_hour,
    //  ptm->tm_min, 
    //  ptm->tm_sec);

    //方法2:
    strftime(buf, 64, "%Y-%m-%d %H:%M:%S",localtime(&now));
    return buf;
}

特别注意:这里的tm* ptm = localtime(&now); 年份与真实年份偏移1900,月份与真实月份偏移1
这里偏移的1900与Unix纪元【1970-1-1 0:0:0】中的1970,是两个不同的概念,不要混淆。
设置系统时间
1、c语言的time()方法,返回从Unix纪元【1970-1-1 0:0:0】至当前的秒数。
    注意:time()只能获取系统时间,不能设置系统时间。
2、使用time()方法获取系统时间,有两种用法:
    time_t aa = time(NULL);
    
    time_t bb;
    time(&bb);
    当然,下面的方法也可以获取系统时间,cc和dd的取值相同。
    time_t cc;
    time_t dd = time(&cc);
3、那么如何设置系统时间呢?
    使用windows的库函数,如下:
    SYSTEMTIME sysTime;
    GetLocalTime(&sysTime);
    
    sysTime.wYear = 2015;
    sysTime.wMonth = 10;
    sysTime.wDay = 20;
    sysTime.wHour = 14;
    sysTime.wMinute = 38;
    sysTime.wSecond = 30;

    int ret = SetLocalTime(&sysTime);
    int errCode = GetLastError();
4、Linux下面可以使用 date -s命令设置时间。
Copyright (c) 2015~2016, Andy Niu @All rights reserved. By Andy Niu Edit.