为了账号安全,请及时绑定邮箱和手机立即绑定

计算PHP中日期之间的绝对差异

计算PHP中日期之间的绝对差异

PHP
繁花如伊 2021-11-26 19:46:13
我正在尝试创建一个函数,我可以用它来查找 2 个日期时间之间的差异,但我希望能够返回每个日期时间的绝对值。说差别是15分20秒,我希望能输出15分20秒,或者920秒。这也将扩展到天、月、年。因此,2 天 12 分钟可能是 2 天、48 小时、2892 分钟或 173520 秒。我最初是从我自己的代码开始的,但想在考虑天、月和年时考虑适当的差异,所以我改为使用 DateDiff,我现在发现它不能像我想要的那样工作。这是一个代码示例$dtmNow = new \DateTime();$authExpireDtm = new \DateTime();$authExpireDtm->modify('+15 minutes');echo friendlyDtmDiff($dtmNow->format('Y-m-d H:i:s'), $authExpireDtm->format('Y-m-d H:i:s'), 'l', 's');我想输出900 seconds,但输出0 seconds,这是该对象$interval有DateInterval Object ( [y] => 0 [m] => 0 [d] => 0 [h] => 0 [i] => 15 [s] => 0 [f] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => 0 [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 ) 如您所见0,该s项目下没有任何内容 ( ) ,因此当然我的函数正在返回0 seconds. 我想知道如何让它返回900秒数。我知道比较时间(小时、分钟、秒)很容易,但我想在转换天、月、年时得到准确的结果。所以,如果我把2020-02-28 00:00:00和2020-03-01 00:00:00它将返回172800 seconds或2880 minutes,但如果我把2019-02-28 00:00:00和2019-03-01 00:00:00它将返回86400 seconds或1440 minutes有没有人能够指出我正确的方向来实现我所追求的结果
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这是一个可以完成您想要的 99% 的函数(它不实现四舍五入 when length != 'l',也不会删除sfrom eg 1 years)。0 值不会输出,尽管您可以添加一个参数来控制它。


function friendlyDtmDiff($date1, $date2, $length = '', $format = '') {

    // Create DateTime for diff()

    $dt1 = new \DateTime($date1);

    $dt2 = new \DateTime($date2);


    // Create intervals

    if ($dt1 < $dt2) {

        $sign = '';

        $interval = $dt1->diff($dt2);

    }

    else {

        $sign = '-';

        $interval = $dt2->diff($dt1);

    }

    // Output format (minimum 2 digits for upper case formats)

    $of = ($format < 'a') ? '%02d' : '%d';


    // generate output using an array of terms to be imploded

    $output = array();

    // create time components

    switch ($format) {

        case 'Y':

        case 'y':

            $years = $interval->y;

            if ($years) $output[] = sprintf("$of years", $years);

            if ($length != 'l') break;

            $interval->y = 0;

        case 'M':

        case 'm':

            $months = $interval->y * 12 + $interval->m;

            if ($months) $output[] = sprintf("$of months", $months);

            if ($length != 'l') break;

            $interval->m = $interval->y = 0;

        case 'D':

        case 'd':

            $days = ($interval->y * 12 + $interval->m) * 30 + $interval->d;

            if ($days) $output[] = sprintf("$of days", $days);

            if ($length != 'l') break;

            $interval->d = $interval->m = $interval->y = 0;

        case 'H':

        case 'h':

            $hours = (($interval->y * 12 + $interval->m) * 30 + $interval->d) * 24 + $interval->h;

            if ($hours) $output[] = sprintf("$of hours", $hours);

            if ($length != 'l') break;

            $interval->h = $interval->d = $interval->m = $interval->y = 0;

        case 'I':

        case 'i':

            $minutes = ((($interval->y * 12 + $interval->m) * 30 + $interval->d) * 24 + $interval->h) * 60 + $interval->i;

            if ($minutes) $output[] = sprintf("$of minutes", $minutes);

            if ($length != 'l') break;

            $interval->i = $interval->h = $interval->d = $interval->m = $interval->y = 0;

        case 'S':

        case 's':

            $seconds = (((($interval->y * 12 + $interval->m) * 30 + $interval->d) * 24 + $interval->h) * 60 + $interval->i) * 60 + $interval->s;

            if ($seconds) $output[] = sprintf("$of seconds", $seconds);

            break;

        default:

            return 'Invalid format';

            break;

    }

    // put the output string together

    $last = array_pop($output);

    return $sign . (count($output) ? implode(', ', $output) . ' and ' : '') . $last;

}

用法示例:


echo friendlyDtmDiff('2020-02-28 00:00:00', '2020-03-01 12:00:56', '', 'h') . PHP_EOL;

echo friendlyDtmDiff('2020-02-28 00:00:00', '2020-03-01 12:00:56', 'l', 'h') . PHP_EOL;

echo friendlyDtmDiff('2020-02-28 00:00:00', '2020-03-01 12:08:56', 'l', 'h') . PHP_EOL;

echo friendlyDtmDiff('2018-12-28 00:00:00', '2020-04-11 04:08:56', 'l', 'y') . PHP_EOL;

echo friendlyDtmDiff('2018-12-28 00:00:00', '2020-04-11 04:08:56', 'l', 'm') . PHP_EOL;

echo friendlyDtmDiff('2018-12-28 00:00:00', '2020-04-11 04:08:56', 'l', 'd') . PHP_EOL;

echo friendlyDtmDiff('2018-12-28 00:00:00', '2020-04-11 04:08:56', 'l', 'h') . PHP_EOL;

echo friendlyDtmDiff('2018-12-28 00:00:00', '2020-04-11 04:08:56', 'l', 'i') . PHP_EOL;

echo friendlyDtmDiff('2018-12-28 00:00:00', '2020-04-11 04:08:56', 'l', 's') . PHP_EOL;

输出:


60 hours

60 hours and 56 seconds

60 hours, 8 minutes and 56 seconds

1 years, 3 months, 14 days, 4 hours, 8 minutes and 56 seconds

15 months, 14 days, 4 hours, 8 minutes and 56 seconds

464 days, 4 hours, 8 minutes and 56 seconds

11140 hours, 8 minutes and 56 seconds

668408 minutes and 56 seconds

40104536 seconds

3v4l.org 上的演示


查看完整回答
反对 回复 2021-11-26
  • 1 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信