You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用strptime()将char类型转换为time结构并解决difftime报错

问题解决思路

错误根源

你遇到的编译警告和转换问题来自三处错误:

  • difftime要求传入两个time_t类型的参数,你错误传入了char数组buffer和函数指针localtime,类型完全不匹配
  • strptime的格式字符串和你实际存储的lastlogged格式YYYY:MM:DD:HH:MM:SS不匹配,用%x%X无法正确解析出时间字段
  • 缺少mktime调用:strptime仅能把字符串解析填充到struct tm结构体中,需要手动调用mktime把struct tm转换为time_t类型才能传给difftime计算差值

修正步骤

  1. 调整strptime的格式字符串为%Y:%m:%d:%H:%M:%S,和你存储的时间格式完全对应
  2. 调用mktime把填充完成的struct tm res转换为time_t类型的上次登录时间
  3. 调用difftime时传入当前时间的time_t值(你之前已经存在变量t中)和转换得到的上次登录time_t值,得到的差值就是两次时间间隔的秒数
  4. 注意使用struct tm前先清零初始化,避免脏数据导致转换异常

修正后的代码片段

// 前面的变量定义保持不变
t = time (NULL);
timeptr  = localtime (&t);
    
printf("_____ Log-in Statistics _____\n");
for(int i = 0; i < STDAMNT; i++) {
    strcpy(buffer, z->students[i].lastlogged);
    // 先清零tm结构体,避免脏数据
    memset(&res, 0, sizeof(struct tm));
    // 用和存储格式匹配的格式串解析
    strptime(buffer, "%Y:%m:%d:%H:%M:%S", &res);
    // 将tm结构转为time_t
    time_t last_login_time = mktime(&res);
    // 第一个参数是较晚的时间,第二个是较早的时间,得到差值为秒数
    difference = difftime(t, last_login_time);
    // 后续处理差值的逻辑
}

如果需要计算的是上次登录到当前的总时长,直接对difference的秒数做时分秒转换即可。

内容的提问来源于stack exchange,提问作者user10534537

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:06:02