【问题标题】:How can I find the percentage of completion?我怎样才能找到完成的百分比?
【发布时间】:2015-01-05 04:34:15
【问题描述】:

我正在开发一个计算项目完成百分比的 PHP 页面。例如,如果您的开始日期为 2015 年 1 月 1 日,结束日期为 2015 年 3 月 3 日,而今天是 2015 年 2 月 2 日,则估计该项目大约完成了 50%。到目前为止,我已经尝试使用 DateTime 类和 date_diff 函数,但我无法将两者分开,所以我回到了第一格。显然,我需要将夏令时和闰年考虑在内,这样就增加了一层额外的复杂性。有任何想法吗?这里是当前块。

try {
    $dbh = new PDO('mysql:host=localhost; dbname=jkaufman_hartmanbaldwin', $username, $password, array(
        PDO::MYSQL_ATTR_SSL_KEY => '../php_include/codekaufman_com.key',
        PDO::MYSQL_ATTR_SSL_CERT => '../php_include/codekaufman_com.crt',
        PDO::MYSQL_ATTR_SSL_CA => '../php_include/codekaufman_com.ca_bundle'
    ));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $projectName = $_GET['project'];

    $sth = $dbh->prepare('SELECT start, end FROM projects WHERE name = ?');
    $sth->execute([$projectName]);

    if($sth->rowCount()) {
        $row = $sth->fetchAll(PDO::FETCH_ASSOC);

        date_default_timezone_set('America/Los_Angeles');

        $date = strtotime($row[0]['start']);
        $start = date('m/d/Y', $date);
        echo $start;

        $date = strtotime($row[0]['end']);
        $end = date('m/d/Y', $date);
        echo " " . $end;

        $today = date('m/d/y');

        echo $end - $start;
    }
} catch(PDOException $e) {
    echo $e->getMessage();
}

【问题讨论】:

    标签: php datetime


    【解决方案1】:

    参考How to Minus two dates in php

    $start = new DateTime($row[0]['start']);
    $end = new DateTime($row[0]['end']);
    $today = new DateTime();
    
    $total = $start->diff($end);
    $current = $start->diff($today);
    $completion = $current->days / $total->days;
    

    【讨论】:

      【解决方案2】:

      MySQL 有一些非常易于使用的函数来处理这类事情,您只需在查询中收集您需要的信息:

      SELECT start, end, DATEDIFF(end, start) as total_days, DATEDIFF(end, NOW()) as days_remaining
          FROM projects WHERE name = ?
      

      http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

      从那里您只需将 days_remaining 除以 total_days 即可获得百分比。 Datediff 应考虑闰年和 DST。

      如果您需要更精确,可以使用 TIMEDIFF 代替 DATEDIFF,只需确保使用 strtotime 将 sql 时间戳转换为整数。

      您可能还需要设置时区:

      SET time_zone = 'America/Los_Angeles';
      

      【讨论】:

        【解决方案3】:

        公式为:

        percentage = (date - start) / (end - start) * 100
        

        作为 PHP 函数:

        function date_progress($start, $end, $date = null) {
            $date = $date ?: time();
            return (($date - $start) / ($end - $start)) * 100;
        }
        

        例子:

        $start   = strtotime("January 1st 2015");
        $end     = strtotime("March 3rd 2015");
        $date    = strtotime("February 2nd 2015");
        $percent = date_progress($start, $end, $date);
        
        // "You are 52.46% there!"
        echo 'You are ', round($percent, 2), '% there!';
        

        【讨论】:

        • 正如您所解释的那样,您的答案被接受似乎是公平的。谢谢。
        【解决方案4】:

        以正确的格式 (YYYY-MM-DD) 获取您的 SQL 输出,然后将其推送到以下代码中:

        <?php
        
        $startDate = date_create('2015-01-01');
        $endDate = date_create('2015-01-30');
        $currentDate = date_create('2015-01-08');
        
        $totalTime = date_diff($endDate, $startDate); 
        $elapsedTime = date_diff($currentDate, $startDate);
        
        $totalTimeDays = $totalTime->format("%d");
        $elapsedTimeDays = $elapsedTime->format("%d");
        
        echo "Total project time = " . $totalTimeDays . "<br/>";
        echo "Elapsed project time = " . $elapsedTimeDays  . "<br/>";
        echo "Percent of project complete = " . ($elapsedTimeDays / $totalTimeDays) * 100.0;
        
        ?>
        

        【讨论】:

          【解决方案5】:
          $start = new DateTime("<YOUR START DATE>");  // example input "2014/06/30"
          $end= new DateTime("<YOUR END DATE>");
          $now = new DateTime();
          
          $intervalOBJ = $start->diff($end);
          $totalDaysOfProject = $intervalOBJ->format('%a'); 
          $intervalOBJ_2 = $now->diff($end);
          $daysRemaining = $intervalOBJ_2->format('%a'); 
          $completedPercentage = round(($daysRemaining/$totalDaysOfProject)*100);
          
          echo $completedPercentage . "% of this project has been completed!";
          

          说明:计算剩余天数的百分比。间隔 = $start 到 $end。计算的百分比与 $now 相关。

          【讨论】:

            猜你喜欢
            • 2011-12-14
            • 2016-05-19
            • 2021-12-03
            • 1970-01-01
            • 2022-12-17
            • 2014-09-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多