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来处理日期比较,这样能避免字符串/整数转换的坑,还能准确处理年份、闰年等边界情况。具体步骤如下:
- 构建目标日期的
struct tm结构体(注意:tm_year是从1900年开始的偏移值,tm_mon是0-11代表1-12月); - 将目标日期的
tm结构体转换为time_t时间戳; - 直接比较当前时间戳和目标时间戳的大小,判断是否过期。
修改后的代码如下:
#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
相关产品推荐
相关产品推荐

