2012-12-28 83 views
0

我的表有一列,它在mysql time()格式中被格式化。
當它是一個值分配到名爲$preRemainOt
我要重新安排它到最近的15分鐘進入最接近的15分鐘

function roundTime($whatTime) 
{ 

echo $whatTime."=>"; 

$roundTime= round (strtotime($whatTime)/60 * 15 ); 

echo date("H:i:s",$roundTime)."<br>"; 

return date("H:i:s",$roundTime); 
} 

    $validOt =roundTime($preRemainOt); 

<pre> 
few bad result given from my try as follow: 
$preRemainOt=>$validO 
    03:43:00=>06:55:45 
    01:05:00=>06:16:15 
    02:00:00=>06:30:00 
but result shuld be as follow: 
$preRemainOt=>$validO 
    03:43:00=>03:45:00 
    01:05:00=>01:00:00 
    02:00:00=>02:00:00 


1.pls給我一個想法PHP變量。
2.如果我的剩餘值($preRemainOt)超過24小時,會發生什麼 ex:$preRemainOt='26:43:00'對於php或mysql函數無關緊要。
什麼是存儲這樣的OT計算

UPDATE1
一些建議後,我在三節潑我的功能最好的MySQL數據類型

function secondToTime($timeStamp) 
{ 
     $hours=intval($timeStamp/3600); 
     $mins=intval($timeStamp/60) % 60; 
     $secs=$timeStamp % 60; 
    return sprintf("%d:%02d:%02d",$hours, $mins, $secs); 
} 

function timeToSecond($time='00:00:00') 
{ 
    list($hours, $mins, $secs) = explode(':', $time); 
    $timeToSecond = ($hours * 3600) + ($mins * 60) + $secs; 

    return $timeToSecond; 
} 

function roundTime($interval='00:00:00') 
{ 
    $interval=timeToSecond($interval); 
    $interval = intval($interval) + 450; 
    $interval -= $interval % 900; 
    return secondToTime($interval); 
} 

列值分配到因爲之前$preRemainOt變量,還有另外幾個steps.i也改變這樣兩個步驟,

function timeDiff($lastTime,$firstTime) 
{ 
$firstTimetime=timeToSecond($firstTime); 
$lastTime=timeToSecond($lastTime); 
$timeDiff=$lastTime-$firstTime; 

return secondToTime($timeDiff); 
} 

function timeAdd($firstTime,$lastTime) 
{ 
$firstTimetime=timeToSecond($firstTime); 
$lastTime=timeToSecond($lastTime); 
$timeAdd=2*$lastTime-$firstTime;; 
return secondToTime($timeAdd); 
} 

所以我決定使用選擇UNIX_TIMESTAMP()是困難的。這將改變我的整個腳本。 在這種情況下"%d:%02d:%02d"給廢話

+0

1天= 24小時,你想加班(每天)> 1天?嗯..有趣.. – Fr0zenFyr

+0

yes.thank你的注意力 – kbitsoft

回答

2

試試這個:

function roundTime($whatTime) { 
    $time = strtotime($whatTime) + 450; 
    return date("H:i:s", $time - $time % 900); 
} 

編輯:

事實上,根據您在下面評論,這裏就是我想要做的。如果這是一個時間間隔,而不是一個文字時間點,我會將該值存儲在數據庫中,而不是DATETIME類型的整數秒。所以30:37:29將被存儲爲110249,因爲110249秒是30小時37分29秒。

然後,而不是通過「30:37:29」這個功能,你就過去110249.然後,該函數是:

function roundTime($interval) { 
    $interval = intval($interval) + 450; 
    $interval -= $interval % 900; 
    return sprintf("%d:%02d:%02d", 
     intval($interval/3600),  // hours 
     intval($interval/60) % 60, // minutes 
     $interval % 60);    // seconds 
} 

如果您已經存儲了一堆東西在數據庫並且絕對不能將其轉換爲秒而不是DATETIME,那麼在您的查詢中,而不是查詢DATETIME,請使用UNIX_TIMESTAMP函數以及上面的函數。換句話說,而不是這個,:

SELECT id, name, preRemainOt, other_stuff... 

這樣做:

SELECT id, name, UNIX_TIMESTAMP(preRemainOt) AS preRemainOt, other_stuff... 

然後該列的整數值傳遞給每局的功能,而不是DATETIME的值。

+0

900是因爲15分鐘是900秒。如果您在15分鐘的時間內將超過7.5分鐘(450秒)的時間增加了,則第一行有效地增加了時間。 $ time - $ time%900的計算只需要將時間除以15分鐘時的所有餘數減去,並且有效地丟棄超過15分鐘標記的任何額外分鐘和秒數。 –

+0

好的,謝謝你能解釋什麼$時間 - $時間%900減去做這將是我的錯誤 – kbitsoft

+0

echo roundTime('30:37:29');給予不好的答案。$ preRemainOt持有加班時間(ot)。這實際上不是真正的時鐘time.i表示時鐘時間不超過'23:59:59' – kbitsoft