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

C语言日期判断编译警告问题咨询及最优实现方案

解决日期过期判断的问题及代码优化

先来说说你遇到的两个警告的原因:

  • 第一个警告:int as = "22051222"; 这里你把字符串字面量(本质是指向字符数组的指针char*)直接赋值给了int类型变量。C语言会把指针的内存地址强制转换成整数,这完全不是你想要的“存储日期数值”的操作,所以编译器抛出类型不匹配的警告。
  • 第二个警告:if ( as < buffer ) 这里as是整数,而buffer是字符数组(在表达式中会退化成char*指针),你实际在比较的是整数和指针的内存地址,根本不是在比较日期的先后,这当然会触发警告。

而且你的代码还有一个隐藏问题:strftime的格式%d%m%H%M没有包含年份,如果当前年份和目标日期的年份不同(比如目标是2020年,当前是2024年),字符串比较会完全失效,导致判断错误。


最优实现方式:直接操作时间结构体与时间戳

最可靠的方式是利用C标准库的struct tm和time_t来处理日期比较,这样能避免字符串/整数转换的坑,还能准确处理年份、闰年等边界情况。具体步骤如下:

  1. 构建目标日期的struct tm结构体(注意:tm_year是从1900年开始的偏移值,tm_mon是0-11代表1-12月);
  2. 将目标日期的tm结构体转换为time_t时间戳;
  3. 直接比较当前时间戳和目标时间戳的大小,判断是否过期。

修改后的代码如下:

#include <stdio.h>
#include <time.h>

int main() {
    time_t rawtime;
    struct tm* current_time;
    struct tm target_time = {0}; // 初始化结构体,避免垃圾值

    // 获取当前时间
    time(&rawtime);
    current_time = localtime(&rawtime);

    // 设置目标日期:2020年5月22日 12:22
    target_time.tm_year = 2020 - 1900; // 年份减1900
    target_time.tm_mon = 5 - 1;        // 月份减1(0代表1月)
    target_time.tm_mday = 22;
    target_time.tm_hour = 12;
    target_time.tm_min = 22;
    target_time.tm_sec = 0;

    // 将目标日期转换为time_t时间戳
    time_t target_timestamp = mktime(&target_time);

    printf("----------------------------------------\n");
    // 打印当前时间(包含年份,格式更清晰)
    char current_buffer[80];
    strftime(current_buffer, sizeof(current_buffer), "%Y-%m-%d %H:%M:%S", current_time);
    printf("当前时间:%s\n", current_buffer);

    // 比较时间戳
    if (rawtime > target_timestamp) {
        printf("22/05/2020 - 12:22 ------ Florian.M\n\n"); // 已过期
    } else {
        printf("22/05/2020 - 12:22 ------ Florian.M>>>\n\n"); // 未过期
    }
    printf("----------------------------------------\n");

    getchar();
    return 0;
}

补充:如果坚持用字符串比较(不推荐)

如果你一定要用字符串方式实现,需要修正类型错误并补充年份格式,代码如下:

#include <stdio.h>
#include <time.h>
#include <string.h> // 需要strcmp函数

int main() {
    time_t rawtime;
    struct tm* timeinfo;
    char buffer[80];
    const char* target_date = "202005221222"; // 格式改为YYYYMMDDHHMM

    time(&rawtime);
    timeinfo = localtime(&rawtime);
    printf("----------------------------------------\n");
    // 修改格式为包含年份的YYYYMMDDHHMM
    strftime(buffer, 80, "%Y%m%d%H%M", timeinfo);
    puts(buffer);
    printf("----------------------------------------\n");

    // 使用strcmp比较字符串:返回值>0表示buffer大于target_date,即当前时间更晚
    if (strcmp(buffer, target_date) > 0) {
        printf("22/05/2020 - 12:22 ------ Florian.M\n\n");
    } else {
        printf("22/05/2020 - 12:22 ------ Florian.M>>>\n\n");
    }
    printf("----------------------------------------\n");
    getchar();
    return 0;
}

注意:字符串比较仅在格式完全一致(比如都是YYYYMMDDHHMM,按时间从大到小的顺序排列)时有效,一旦格式变动就容易出错,所以还是推荐第一种直接操作时间戳的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:02:39