C中的当地时间是否有反向功能?

时间:2014-10-06 03:56:37

标签: c linux

我有一个包含

的字符串

YYYY/MON/DATE-HR:MIN:SEC

我想获取所有字段的各个值,尤其是在TM结构中存储的秒数。

是否有任何功能可以进行此转换(或)实现它的任何其他方式?

3 个答案:

答案 0 :(得分:2)

实现它的其他方式(假设为YYYY/MM/DD-HH:MM:SS):

struct tm Str2Tm(const char* str)
{
    struct tm var = {0};
    var.tm_isdst = -1; // daylight saving time information is not available
    var.tm_year = 1000*(str[0]-'0')+100*(str[1]-'0')+10*(str[2]-'0')+1*(str[3]-'0')-1900;
    var.tm_mon  = 10*(str[ 5]-'0')+1*(str[ 6]-'0')-1;
    var.tm_mday = 10*(str[ 8]-'0')+1*(str[ 9]-'0');
    var.tm_hour = 10*(str[11]-'0')+1*(str[12]-'0');
    var.tm_min  = 10*(str[14]-'0')+1*(str[15]-'0');
    var.tm_sec  = 10*(str[17]-'0')+1*(str[18]-'0');
    return var;
}

如果月份是三字母格式,那么您必须以不同的方式获得var.tm_mon

int GetMon(const char* str)
{
    static const char mon_name[][4] =
    {
        "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
    };
    for (int i=0; i<12; i++)
    {
        if (str[5]==mon_name[i][0] && str[6]==mon_name[i][1] && str[7]==mon_name[i][2])
            return i;
    }
    return -1;
}

答案 1 :(得分:0)

您可以尝试使用sscanf()

void filltm(char* str , struct tm* tim)
{
    sscanf(str , "%d/%d/%d-%d:%d:%d" , &tim->tm_year , &tim->tm_mon , &tim->tm_mday , &tim->tm_hour , &tim->tm_min , &tim->tm_sec);
    tim->tm_year -= 1900;
    tim->tm_mon--;

}

答案 2 :(得分:-1)

基本错误检查的简单sscanf()解决方案。

struct tm tm = {0};
if (6 != sscanf(str, "%d/%d/%d-%d:%d:%d", 
    &tm.tm_year, &tm.tm_mon, &tm.tm_mday, 
    &tm.tm_hour, &tm.tm_min, &tm.tm_sec)) Handle_BadInput();
tm.tm_year -= 1900;
tm.tm_mon--;
tm.tm_isdst = -1;
localtime(&tm);  // set tm_wday, tm_yday fields.