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

标签 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"};
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);

最佳答案

在调用mktime()之前,代码需要初始化tm_struct()的7+个字段:year, month,day, hour min, sec, isdst 和其他潜在的。

2 个异常(exception):.tm_yday、.tm_wday 在调用 mktime() 之前不需要赋值。

年、月、日应设置为合理的值:让我们使用 2000 年 1 月 1 日。或者代码可以使用 time_t() 获取今天。

代码使用 ms 暗示该值以毫秒为单位。它不是。还是几秒钟。

使用本地 time_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

关于使用 sscanf 将字符串转换为时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31380153/

相关文章:

ios - 通过 Multipeer Framework 暂时同步两个客户端

python - pandas.series 中的前向滚动时间窗口

比较 C 中两个设置位置(整数值)之间两个字符串的两个子字符串

java - Android - 获取自定义字符串

c++ - 以编程方式获取环回接口(interface)/C++

c++ - 使用带有 char * 的正则表达式迭代器

delphi - 如何判断字符串中的所有字符是否相等

java - 时间选择器 ontimeset 错误

c - 评估字符数组中给出的数学表达式

c - 当一个线程失败时退出所有线程