簡體   English   中英

以15分鍾為間隔計算PHP小時,數組中的工作時間永遠不會累加

[英]PHP hour calculation on 15 minutes interval and working hours in array never add up

我有一個開始時間和結束時間,它們總是在一個小時:00或:15,:30,:45上開始或結束。

例如:

00:30 21-05-2012 // startdate and time
18:15 22-05-2012 // enddate and time (+1 day)

如果時間到了晚上或晚上,我必須多收%。

因此,我有2個數組,看起來像這樣,一個在晚上,一個在晚上。

$eveningHours = array(
    '18:00',
    '18:15',
    '18:30',
    // etcetera
    '00:00'
);

上面的數組基本上涵蓋了從18:00-00:00的時間,因為這些時間已經變成了傍晚時間。

夜間同樣如此,它們覆蓋的時間為00:00-07:00。

由於開始時間和結束時間始終精確到:00或:15,:30,:45。。我在開始日期時間和結束日期時間之間以15分鍾的間隔運行一個循環,然后在每個間隔上檢查是否當前的間隔時間是晚上/晚上,然后將+15加到晚上/晚上的小時計數器,最后我將其除以60得到總時數。

但是不知何故,它總是要花15分鍾到15分鍾甚至不到15分鍾的時間...我已經嘗試了幾乎所有內容,但無法使其正常工作。

因此,例如開始時間為00:30,它已經為第一個間隔增加了15分鍾:

00:30(計數器:+15)00:45(計數器:+15)

總共需要30分鍾,但是如果您從00:30到00:45上班,則應該只有15分鍾。.所以我認為那是哪里出錯了。 我只需要一種方法來解決它。我已經嘗試過很多事情,以-15分鍾啟動計數器,或者檢查開始或結束時間是否在一個小時范圍內,然后將計數器設置為-15或+ 15分鍾..但這也出錯。

編輯這是循環的基礎:

$start_time = mktime($_POST['worked_start_hour'], $_POST['worked_start_min'], 0, date("m"), date("d", strtotime("+1 days")), date("Y")); // +1 day for testing purpose
$end_time   = mktime($_POST['worked_end_hour'], $_POST['worked_end_min'], 0, date("m"), date("d", strtotime("+2 days")), date("Y")); // +2 days for testing purpose

$date['start_h_i']  = date("Y-m-d H:i", $start_time); # Start date: yyyy-mm-dd hours:minutes
$date['end_h_i']    = date("Y-m-d H:i", $end_time);   # End date: yyyy-mm-dd hours:minutes

$counter['eveningMinutes'] = 0;
$counter['nightMinutes'] = 0;

$eveningHours = array(
  '18:00',
  '18:15',
  '18:30',
  '18:45',
  '19:00',
  '19:15',
  '19:30',
  '19:45',
  '20:00',
  '20:15',
  '20:30',
  '20:45',
  '21:00',
  '21:15',
  '21:30',
  '21:45',
  '22:00',
  '22:15',
  '22:30',
  '22:45',
  '23:00',
  '23:15',
  '23:30',
  '23:45',
  '00:00'

);


$nightHours = array(
    '00:00',
    '00:15',
    '00:30',
    '00:45',
    '01:00',
    '01:15',
    '01:30',
    '01:45',
    '02:00',
    '02:15',
    '02:30',
    '02:45',
    '03:00',
    '03:15',
    '03:30',
    '03:45',
    '04:00',
    '04:15',
    '04:30',
    '04:45',
    '05:00',
    '05:15',
    '05:30',
    '05:45',
    '06:00',
    '06:15',
    '06:30',
    '06:45',
    '07:00'
);

while (strtotime($date['start_h_i']) <= strtotime($date['end_h_i'])) {

    if (in_array(date("H:i", strtotime($date['start_h_i'])), $eveningHours)) {
        $counter['eveningMinutes'] = $counter['eveningMinutes'] + 15;
    }

    if (in_array(date("H:i", strtotime($date['start_h_i'])), $nightHours)) {
        $counter['nightMinutes']  = $counter['nightMinutes'] + 15;
    }

    $date['start_h_i'] = date ("Y-m-d H:i", strtotime("+15 minutes", strtotime($date['start_h_i']))); // 15 minutes interval

} // end while

我希望有人可以在這里發光,謝謝!

任何人?

更改此行:

while (strtotime($date['start_h_i']) <= strtotime($date['end_h_i'])) {

對此:

while (strtotime($date['start_h_i']) < strtotime($date['end_h_i'])) {

您遇到的問題是您要更新已經計算完時間的小時數。 因此,以您自己的00:30 - 00:45 : 00:30 - 00:45為例:

  • 首次循環播放:00:30 <= 00:45,因此加15分鍾
  • 第二次循環播放:00:45 <= 00:45,因此加15分鍾

通過改變<=<您刪除第二操作:00:45 <00:45所以加什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM