【问题标题】:Is there a reverse function for local time in C? [duplicate]C语言中是否有本地时间的反向功能? [复制]
【发布时间】:2014-10-06 03:56:36
【问题描述】:

我有一个包含

的字符串

YYYY/MON/DATE-HR:MIN:SEC

我想获取所有字段的单独值,尤其是 TM 结构中的秒数。

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

【问题讨论】:

标签: c linux


【解决方案1】:

其他实现方式(假设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;
}

如果月份是 3 个字母的格式,那么您必须以不同的方式获取 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;
}

【讨论】:

  • @chux:谢谢。这三个我不太确定,所以我将整个结构初始化为 0。那我只需要将第一个设置为 -1 吗?
  • @chux:谢谢。我的意思是您在第一条评论中提到的三个字段。
【解决方案2】:

您可以尝试使用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--;

}

【讨论】:

    【解决方案3】:

    简单的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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2011-04-05
      • 2015-10-08
      相关资源
      最近更新 更多