使用sscanf将字符串转换为时间

使用sscanf将字符串转换为时间,c,string,time,C,String,Time,我试图在windows上用C语言将时间字符串转换成时间格式。因为我的字符串中只有小时、分钟和秒,所以尝试使用sscanf将字符串解析为时间格式,然后使用mktime。但不知怎么的,它并没有把它转换成时间格式。为了检查,我尝试将转换后的时间打印回字符串。代码如下所示: struct tm tm; char time_buffer[100]; int hh, mm; float ms; time_t time_value; char *timestamp = {"16:11:56.484"}; ss

我试图在windows上用C语言将时间字符串转换成时间格式。因为我的字符串中只有小时、分钟和秒,所以尝试使用sscanf将字符串解析为时间格式,然后使用mktime。但不知怎么的,它并没有把它转换成时间格式。为了检查,我尝试将转换后的时间打印回字符串。代码如下所示:

struct tm tm;
char time_buffer[100];
int hh, mm;
float ms;
time_t time_value;
char *timestamp = {"16:11:56.484"};
sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ms);
tm.tm_hour =hh;
tm.tm_min = mm;
tm.tm_sec = ms*1000;
tm.tm_isdst = -1;
time_value = malloc(100*sizeof(char));
time_value = mktime(&tm);
if (time_value==-1)
    printf ("unable to make time");
strftime(time_buffer, sizeof(time_buffer), "%c", &tm);
printf(time_buffer);
  • 您不需要设置
    struct tm
    ,只需设置
    tm\u hour
    tm\u min
    tm\u sec
    tm\u isdst
    。所有其他字段未初始化,因此具有未知/未定义的值
  • 如果使用
    memset(&tm,0,sizeof(tm))
    初始化
    struct tm
    ,您可能仍然会收到一个错误,因为该结构所包含的字段并不都允许
    0
    作为有效值(
    tm\u mday
    )。有关参考信息,请参阅
  • 您输入到
    tm_sec
    中的值可能无效。实际上,您希望它是
    ms/1000
    ,而不是
    ms*1000

  • 在调用
    mktime()
    之前,代码需要初始化
    tm_struct()
    的7个以上字段:
    年、月、日、小时分钟、秒、isdst
    和其他可能的字段

    2个例外:
    .tm_yday、.tm_yday
    在调用
    mktime()
    之前不需要赋值

    年、月、日的设置应该合理:让我们使用2000年1月1日。或者,代码可以使用
    time\u t()
    获得今天

    代码使用ms提示该值以毫秒为单位。事实并非如此。它还在几秒钟之内

    使用本地
    时间\u t
    变量,而不是分配一个<代码>malloc()不需要

    struct tm tm = {0};
    tm.tm_year = 2000 - 1900;  // Years from 1900
    tm.tm_mon = 1 - 1; // Months from January
    tm.tm_mday = 1;
    char time_buffer[100];
    int hh, mm;
    float ss;
    time_t time_value;
    char *timestamp = "16:11:56.484";
    
    if (sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ss) != 3) Handle_BadData();
    tm.tm_hour = hh;
    tm.tm_min = mm;
    tm.tm_sec = roundf(ss);  // or simply = ss;
    tm.tm_isdst = 0;  // Keep in standard time
    // time_value = malloc(100*sizeof(char));
    time_value = mktime(&tm);
    if (time_value == -1) {
        printf ("unable to make time");
    }
    else {
      strftime(time_buffer, sizeof(time_buffer), "%c", &tm);
      printf(time_buffer);
    }
    
    // Sat Jan  1 16:11:56 2000
    

    使用
    malloc
    分配堆的目的是什么?这只会导致内存泄漏。我的代码中有一个时间戳值数组,这就是我分配内存的原因。这里我没有显示数组来保持代码的简单性。如果你有一个
    time\t
    值数组,你应该以
    sizeof(time\t)
    的倍数来分配,而不是
    sizeof(char)
    。顺便说一句
    sizeof(char)
    是冗余的,标准保证它是
    1
    。它只在time.h中定义。您声明了变量,因此必须对其进行初始化。如果您还在学习:用定义的值初始化您声明的每个变量是一个好习惯。@eckes:非常感谢您的评论。我将其初始化为:tm.tm_hour=16;tm.tm_min=11;tm.tm_sec=56.484*1000;但它仍然显示“无法腾出时间”@learningpal:仔细阅读:您必须初始化
    tm
    提供的每个字段。不仅仅是那些用实际值填充的变量,比如
    tm_hour
    …我在代码中使用了这三个变量,小时、分钟和秒,并对它们进行了初始化。你说的每个字段是指日期和月份名称吗?或者你能举例说明你的实际意思吗?还有“tm_sec”,我需要(ms*1000),因为我需要以毫秒为单位计算时间。谢谢。我没有初始化struct tm的所有变量。但是我需要以毫秒为单位的时间值,您能解释一下如何以毫秒为单位获取该时间吗?使用time\t-time\t作为mktime()的类型结果,代码无法以毫秒为单位移植保存时间值。C不指定时间值的编码方式,除非它是一个数字。自1970年1月1日以来,大多数(并非所有)的
    时间
    为整数秒计数-请参阅。代码可以使用自己的结构,可能一个包含时间字段,另一个包含秒数字段。许多操作系统使用了
    typedef struct timeval{long tv_sec;long tv_usec;}timeval或类似的东西-因此无需重新发明轮子。@learningpal获取毫秒值很容易
    float ms=modff(ss,NULL)*1000.0f那么现在代码有了毫秒值,你想用它做什么?@chux:非常感谢……)我正在实现你的代码,但是当我像你一样初始化tm_year、tm_mon和tm_mday时,我得到了错误:“应该在“=”、“、”、“;”、“;”、“asm”或“attribute”之前加上“‘token’”@chux:ya你是对的。现在可以用了。。非常感谢……)从上一周开始,我一直在努力,但没有发现这些初始化错误。