簡體   English   中英

獲取每個日期 PHP 的 start_time 和 end_time 的總小時數?

[英]Get total hours from start_time and end_time for each date PHP?

我正在使用下面的代碼來找出正確的總小時數,但它給出了錯誤的結果:- 使用 getSortedDays 對我的數組進行排序 使用 addTotalAttendedHours 來添加總數並將其添加到總出席小時數中,我已經嘗試了所有可能的時間方法,但沒有一個在工作中。 即使我嘗試去除腹肌和圓形但沒有任何幫助

<?php

declare(strict_types=1);

$data = [
  '2020-07-14' => 
  [
    [
      'start_time' => '14:15:00',
      'end_time' => '17:45:00',
    ],[
      'start_time' => '14:30:00',
      'end_time' => '17:30:00',
    ],[
      'start_time' => '14:30:00',
      'end_time' => '17:30:00',
    ],
  ],
  '2020-07-15' => [
    [
      'start_time' => '13:30:00',
      'end_time' => '17:00:00',
    ],[
      'start_time' => '09:00:00',
      'end_time' => '14:00:00',
    ],
  ],
];

function getSortedDays(array $days): array {
    return array_map(function (array $day) {
       array_multisort(array_column($day, 'start_time'), SORT_ASC, $day);
       
       return $day;
    }, $days);
}

function addTotalAttendedHours(array $days): array {
    $sortedDays = getSortedDays($days);
    
    $days = array_map(function (array $day) {
        $sum = (new DateTime())->setTimestamp(0);
        $previousEnd = null;
        
        foreach ($day as $time) {
            $currentStart = new DateTimeImmutable($time['start_time']);
            $currentEnd = new DateTimeImmutable($time['end_time']);
            
            $sum->add($currentStart->diff($currentEnd));
            
            if ($previousEnd !== null && $currentStart < $previousEnd) {
                $sum->sub($currentStart->diff($previousEnd));
            }
            
            $previousEnd = $currentEnd;
        }
        
        $attendedSeconds = $sum->getTimestamp();
        $day['total_attended_hours'] = sprintf(
            '%02u:%02u:%02u',
            $attendedSeconds / 60 / 60,
            ($attendedSeconds / 60) % 60,
            $attendedSeconds % 60
        );
        
        return $day;
    }, $sortedDays);
    
    return $days;
}
echo "<pre>";
print_r(addTotalAttendedHours($data));
?>

結果

Array
(
    [2020-07-14] => Array
        (
            [0] => Array
                (
                    [start_time] => 14:15:00
                    [end_time] => 17:45:00
                )

            [1] => Array
                (
                    [start_time] => 14:30:00
                    [end_time] => 17:30:00
                )

            [2] => Array
                (
                    [start_time] => 14:30:00
                    [end_time] => 17:30:00
                )

            [total_attended_hours] => 03:15:00  //It should be 03:30:00
        )

    [2020-07-15] => Array
        (
            [0] => Array
                (
                    [start_time] => 09:00:00
                    [end_time] => 14:00:00
                )

            [1] => Array
                (
                    [start_time] => 13:30:00
                    [end_time] => 17:00:00
                )

            [total_attended_hours] => 08:00:00
        )

)

使用上面的代碼我弄錯了total_attended_hours日期2020-07-14結果應該是03:30:00但它給出的是03:15:00

第一天,您有以下時間范圍:
14:15 – 17:45
14:30 – 17:30
14:30 – 17:30

你正在這樣做:

  • 計算第一個范圍的差異:3:30
  • 計算第二個范圍 (3:00) 的差異並將其添加:3:30 + 3:00 = 06:30
  • 因為第二個范圍的開始在前一個結束之前,所以您要減去它們之間的差異。 14:30 和 17:45 之間的差異是 3:15,所以 6:30 - 3:15 = 3:15
  • 但是第二個范圍已經在 17:30 結束,因此您錯過了 17:30 到 17:45 之間的 15 分鍾。

您可以將減法線更改為:

$sum->sub($currentStart->diff(min($currentEnd, $previousEnd)));

這樣你就不會再減去太多,因為你只會減去重疊部分的差異,直到當前和前一個結束的最小值。

暫無
暫無

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

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