【问题标题】:php subtracting two durations and reduce percentage to get final timephp减去两个持续时间并减少百分比以获得最终时间
【发布时间】:2016-02-24 05:14:15
【问题描述】:

我将持续时间值存储在数据库中,以了解在给定的工作周内我需要做多少事情。例如,我有以下输入来根据总持续时间、减少的持续时间(例如午餐时间、会议、上厕所等)和减少的百分比来计算我在一周内的容量持续时间。例如,我有以下值:

$total_duration = 30:30:00; //(37 hours 30 mins 00 secs)
$reduced_duration = 01:00:00; //(1 hour 00 mins 00 secs)
$capacity_percentage = 90%; // capacity percentage for leeway

因此,我想从$reduced_duration 中减去$total_duration,然后得到$capacity_percentage 总数的百分比。

我正在尝试以下方法;

    $total_duration = '30:30:00'; //(37 hours 30 mins 00 secs)
    $reduced_duration= '01:00:00'; //(1 hour 00 mins 00 secs)
    $capacity_percentage ='90%'; // capacity percentage for leeway

    $total_duration_hrs = 0;
    $total_duration_mins = 0;
    $total_duration_secs = 0;

    $reduced_duration_hrs = 0;
    $reduced_duration_mins = 0;
    $reduced_duration_secs = 0;

    list($total_duration_hours, $total_duration_minutes, $total_duration_minutes) = explode(':', $total_duration);

    list($reduced_duration_hours, $reduced_duration_minutes, $reduced_duration_seconds) = explode(':', $reduced_duration);

    $total_duration_hrs += (int) $total_duration_hours;
    $total_duration_mins += (int) $total_duration_minutes;
    $total_duration_secs += (int) $total_duration_minutes;

    $reduced_duration_hrs += (int) $reduced_duration_hours;
    $reduced_duration_mins += (int) $reduced_duration_minutes;
    $reduced_duration_secs += (int) $reduced_duration_seconds;

    $totalhrs = ($total_duration_hrs - $reduced_duration_hrs);
    $totalmins = ($total_duration_mins - $reduced_duration_mins);
    $totalsecs = ($total_duration_secs - $reduced_duration_secs);

这给了我正确的总时间,即29:30:30。但现在我有点不确定如何找到百分比时间值,我会找到 90% 的小时、分钟和秒,还是会做其他事情?有什么想法吗?

【问题讨论】:

  • 你能以秒为单位将持续时间值存储在数据库中吗?这将使计算变得更加容易。
  • @Tristan 如果您的意思是使用strtotime,那么并不是真的,因为我没有使用日期或时间戳值。如果您知道另一种方法,请分享??

标签: php math time percentage duration


【解决方案1】:

如果您在几秒钟内完成所有操作,并且只在您想要输出或读取值时将其转换为小时、分钟、秒,则会更容易。这样你的逻辑就会变得更简单,对状态的依赖更少。

编写一个函数将秒转换为小时:分钟:秒

function secondsToFormat($seconds) {
    $diff = (new DateTime)->sub(new DateInterval("PT{$seconds}S"))->diff(new DateTime);
    $h = $diff->format("%h") + $diff->format("%a") * 24;
    return $diff->format("{$h}:%I:%S");
}

编写一个将小时:分钟:秒转换为秒的函数

现在您需要一个功能相反的函数,以便您可以轻松地在两者之间进行转换。

function formatToSeconds($formattedTimeString) {
    list($hours, $minutes, $seconds) = explode(":", $formattedTimeString);
    $seconds += $hours * 60 * 60;
    $seconds += $minutes * 60;
    return $seconds;
}

编写一个函数来计算占总数的百分比

function getPercentage($total, $percent) {
    return (int) floor($total / 100 * $percent);
}

现在您可以简单地执行此操作...

$t = formatToSeconds($total_duration);
$r = formatToSeconds($reduced_duration);
$diff = $t - $r; // difference in seconds
echo secondsToFormat(getPercentage($diff, 90)), " at 90% capacity";

你会得到类似26:33:00 at 90% capacity

【讨论】:

  • 我希望答案是小时分钟和秒而不是“90%”容量,例如29:30:30
  • 对不起,我当时可能误解了你的问题。听起来你想要 90% 作为结果,但不管只是使用 formatToSecondssecondsToFormat 函数在它们之间进行转换,你仍然有你的答案:)
  • 更新了答案以更具体地说明您正在寻找的内容。逻辑已经存在了;)
猜你喜欢
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2021-10-18
相关资源
最近更新 更多