2015-01-05 44 views
2

我正在研究計算項目完成百分比的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(); 
} 

回答

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

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,只需確保將sql時間戳轉換爲帶時間戳的整數。

您可能還需要設置時區:

SET time_zone = 'America/Los_Angeles'; 
0

得到正確格式的SQL輸出(YYYY-MM-DD),然後推它代入如下代碼:

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

?> 
1

公式是:

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!'; 
+0

正如你最好的解釋,你的答案被接受似乎是公平的。謝謝。 – Jeffrey

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

說明:這一計算剩餘天的百分比。間隔= $開始到$結束。計算的百分比與現在相關。