2015-09-09 46 views
2

我試圖計算服務的持續時間,以獲得結束時間。每項服務的持續時間值以分鐘爲單位,其中包括:304050如果整個小時內倒計時,或者如果它在php中執行整整一個小時?

每場會議都是在整整一個小時開始(例如11:00,12:00,13:00)。

如果總持續時間落在整整一個小時內(例如12:00,13:00和14:00),它應該設置爲前一小時和59分鐘(例如11:59,12:59, 13:59)。例如,如果選擇兩個30分鐘的服務,則會發生這種情況。

但是,如果它通過一小時,說結束時間是12:20或13:30,那麼結束時間應設置爲12:59或13:59。

這裏是我到目前爲止的代碼:

$startTime = $_POST['datetime']; // (2015-09-09 11:00) 

# calculate total duration of services in order to get end time 
    foreach($_POST['service'] as $service){ 
     list($service_id,$service_duration) = explode(';',$service); // values stored as id;duration 
     $service_ids[] = (int)$service_id; // new array with ids 
     $services_duration_total += (int)$service_duration; // in minutes 
    } 
// 
# calculate end time 
    $endTime_actual = getdate(strtotime('+'.$services_duration_total.' minutes', strtotime($_POST['datetime']))); // actual end time 

這個方法我試過:

$endTime_offset = (60-$endTime_actual['minutes'])-1; // calculate munutes left in the hour 
$endTime = date('Y-m-d H:i',strtotime('+'.$endTime_offset.' minutes',$endTime_actual[0])); // new end time 

這工作如果總時間超過60分鐘,但如果它恰好是60分鐘,或120或180,因爲它然後登陸一整小時。在這些情況下,正如我所提到的,我需要腳本來回滾到最後一小時,並且59分鐘。

我不確定我是否正確解釋了這一點,但希望你能得到我想要完成的工作..

回答

1

你可以。減去1秒,然後再更換「分鐘」有一個固定的「59」的時間戳的一部分:

$endTime = date('Y-m-d H:59', strtotime(
    sprintf('+%d minutes - 1 second', $services_duration_total), 
    strtotime($_POST['datetime']) 
)); 

這樣,所有的結束時間從12:01至13:00被轉換爲12:59(這是我的理解你的問題)

+0

這似乎工作。我必須在'date'函數的最後兩個參數中添加'strtotime',但是在這之後,我運行了幾個不同的測試。看起來不錯。謝謝你的時間。 – ThomasK

+0

哦,我意外地從代碼中刪除了strtotime,現在修復了這個問題。 –

+0

btw。爲什麼'-1秒'?由於我在分鐘內工作,使用'-1分鐘'會有什麼效果嗎?只是出於好奇.. – ThomasK

2

嘗試使用您的日期時間直接(或轉換它的日期時間):

可以基於其分值迫使你日期時間

$date = new DateTime('2001-01-01'); 

$date->setTime($date->format('H'), 59); 

你也可以之前,這迫使小時: http://php.net/manual/en/datetime.sub.php

希望這將幫助

相關問題