PHP中Datediff取整返回0问题:如何将同一天计为1天?
问题原因与解决方法
原因分析
你直接对字符串格式的日期做减法操作,PHP会自动尝试将日期字符串转换为数字。但"2022-11-01"这种带横杠的字符串,PHP只会解析到第一个非数字字符(也就是横杠),所以$end和$start都会被转换为2022,两者相减结果为0,加1后得到1。
接着用这个1除以一天的总秒数60*60*24=86400,得到的是一个极小的小数(约0.00001157),round()函数会把这个小数四舍五入为0,这就是$number_of_days返回0的根本原因。
解决方法
处理日期计算应该用PHP专门的日期时间工具,以下两种方案都能满足你的需求:
方案一:使用DateTime类(推荐)
DateTime是PHP官方推荐的日期处理类,能准确处理各种日期场景:
$end = new DateTime("2022-11-01"); $start = new DateTime("2022-11-01"); $diff = $start->diff($end); // 间隔天数加1,实现包含起止日期的计数 $number_of_days = $diff->days + 1; echo $number_of_days; // 输出1
当起止日期相同时,diff()返回的days属性为0,加1后得到1天;如果是不同日期(比如2022-11-01到2022-11-03),days为2,加1后得到3天,完全符合包含首尾的计数逻辑。
方案二:使用strtotime转换为时间戳
通过strtotime()把日期字符串转为 Unix 时间戳(从1970年1月1日到目标日期的秒数),再进行计算:
$end = strtotime("2022-11-01"); $start = strtotime("2022-11-01"); // 计算间隔天数后加1 $number_of_days = floor(($end - $start) / (60 * 60 * 24)) + 1; echo $number_of_days; // 输出1
时间戳相减得到的是两个日期的间隔秒数,除以86400得到间隔天数,加1后就能实现包含起止日期的计数。
内容的提问来源于stack exchange,提问作者michaelmcgurk
相关产品推荐
相关产品推荐

