PHP中varchar转日期后比较异常:仅比较日未比较月年,如何解决?
问题分析与解决方案
你的问题核心在于用了d/m/Y格式的字符串做日期比较,这种格式的字符串是按字符顺序逐个比对的(先比日,再比月,最后比年),完全不符合实际的日期逻辑。比如05/10/2023(10月5日)和20/09/2023(9月20日),字符串比较会认为前者更小,但实际日期后者更早,这就导致你的判断完全出错。
一、修复行变色的日期比较逻辑
你不需要把日期转成d/m/Y格式来比较,直接用时间戳或者Y-m-d格式的字符串(这种格式的字符串比较和日期顺序完全一致)来判断就可以了。
方案1:用时间戳直接比较(最可靠)
// 从数据库获取日期字符串,直接转成时间戳 $enddate = $get_students_row['course_end_date']; $course_end_timestamp = strtotime($enddate); // 获取当前时间的时间戳 $current_timestamp = time(); // 行变色判断:如果课程结束时间早于等于当前时间,文字变红 <tr <?php if ($course_end_timestamp <= $current_timestamp): ?> style="color:red;" <?php endif; ?>></tr>
方案2:转成Y-m-d格式字符串比较
如果需要保留日期的可读格式,也可以转成Y-m-d(年-月-日)格式,这种格式的字符串比较逻辑和日期顺序一致:
$enddate = $get_students_row['course_end_date']; $course_end_date = date('Y-m-d', strtotime($enddate)); $current_date = date('Y-m-d'); <tr <?php if ($course_end_date <= $current_date): ?> style="color:red;" <?php endif; ?>></tr>
二、修复过期课程数量统计逻辑
你的统计代码有两个问题:一是用了错误的日期格式比较,二是循环里的变量引用错误($vars是数组,你应该用循环的$var)。修正后的代码如下:
用时间戳统计
$yes_count = 0; // 假设$all_end_dates是从数据库获取的所有课程结束日期数组 foreach ($all_end_dates as $enddate) { $course_end_timestamp = strtotime($enddate); $current_timestamp = time(); if ($course_end_timestamp <= $current_timestamp) { $yes_count++; } } // 输出统计结果 echo "过期课程数量:{$yes_count}";
用Y-m-d格式统计
$yes_count = 0; $current_date = date('Y-m-d'); foreach ($all_end_dates as $enddate) { $course_end_date = date('Y-m-d', strtotime($enddate)); if ($course_end_date <= $current_date) { $yes_count++; } } echo "过期课程数量:{$yes_count}";
额外建议
如果你的MySQL数据库里的日期存的是varchar类型,建议改成date或datetime类型。这样可以直接在数据库层面做日期筛选(比如查询过期课程:SELECT * FROM students WHERE course_end_date <= CURDATE()),效率更高,也能避免字符串转时间戳可能出现的格式错误。
内容的提问来源于stack exchange,提问作者Movies Dhamaka
相关产品推荐
相关产品推荐

