PHP计算日期差值返回0及后续1天误差问题求助
日期差值计算的1天误差原因及解决方法
问题描述
我尝试计算两个日期的天、月、年差值,最初所有参数都返回0。参考Markus Zeller的回答修改代码后,能按年龄格式(如1年3个月14天)显示差值,但存在1天误差:以2021-04-15至2022-07-30为例,正确天数应为15天(总471天),但得到14天(总470天)。
修改后的代码如下:
function difference_between_date() { $data1 = new DateTime(wp_get_current_user()->user_registered); //Registered User Date $data2 = new DateTime(); //Current Date $interval = $data1->diff($data2); $diffInSeconds = $interval->s; //example 45 $diffInMinutes = $interval->i; //example 15 $diffInHours = $interval->h; //example 6 $diffInDays = $interval->d; //example 20 $diffInMonths = $interval->m; //example 4 $diffInYears = $interval->y; //example 2 echo '<div class="today_date">days' . wp_kses_post($diffInDays) . '</div>'; echo '<div class="today_date">months' . wp_kses_post($diffInMonths) . '</div>'; echo '<div class="today_date">years' . wp_kses_post($diffInYears) . '</div>'; } add_shortcode('diff_date', 'difference_between_date');
误差原因
问题出在时间精度差异上:
- 用户注册时间
wp_get_current_user()->user_registered通常仅记录到日期维度,时分秒默认为00:00:00 new DateTime()创建的是包含当前具体时分秒的时间对象
比如你在2022-07-30的上午10点执行代码,此时$data2是2022-07-30 10:00:00,和注册时间2021-04-15 00:00:00计算差值时,还没走完当天的完整24小时,因此天数部分会少算1天(实际是14天+10小时,$interval->d只取整数天数14)。
解决方法
将当前时间的时分秒重置为00:00:00,确保两个日期都按完整自然日计算,有两种实现方式:
方式1:重置当前时间的时分秒
function difference_between_date() { $data1 = new DateTime(wp_get_current_user()->user_registered); $data2 = new DateTime(); $data2->setTime(0, 0, 0); // 把时分秒重置为0 $interval = $data1->diff($data2); $diffInDays = $interval->d; $diffInMonths = $interval->m; $diffInYears = $interval->y; echo '<div class="today_date">days' . wp_kses_post($diffInDays) . '</div>'; echo '<div class="today_date">months' . wp_kses_post($diffInMonths) . '</div>'; echo '<div class="today_date">years' . wp_kses_post($diffInYears) . '</div>'; } add_shortcode('diff_date', 'difference_between_date');
方式2:直接创建当天零时对象
用'today'作为参数创建DateTime,自动生成当前日期的00:00:00时间:
$data2 = new DateTime('today'); // 等价于当前日期 00:00:00
内容的提问来源于stack exchange,提问作者Snorlax
相关产品推荐
相关产品推荐

