如何找到完成百分比?

How can I find the percentage of completion?

我正在开发一个计算项目完成百分比的 PHP 页面。例如,如果您的开始日期为 2015 年 1 月 1 日,结束日期为 2015 年 3 月 3 日,而今天是 2015 年 2 月 2 日,则项目估计已完成约 50%。到目前为止,我已经尝试使用 DateTime class 和 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();
}

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';

参考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;

以正确的格式 (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;

?>

公式为:

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!';
$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!";

描述:计算剩余天数的百分比。间隔 = $开始到 $结束。计算的百分比与 $now 有关。