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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:48:29