使用sscanf将字符串转换为时间
我试图在windows上用C语言将时间字符串转换成时间格式。因为我的字符串中只有小时、分钟和秒,所以尝试使用sscanf将字符串解析为时间格式,然后使用mktime。但不知怎么的,它并没有把它转换成时间格式。为了检查,我尝试将转换后的时间打印回字符串。代码如下所示:使用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
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你是对的。现在可以用了。。非常感谢……)从上一周开始,我一直在努力,但没有发现这些初始化错误。