【问题标题】:Displaying correct difference between 2 times显示 2 次之间的正确差异
【发布时间】:2016-07-25 15:09:53
【问题描述】:

我在获取工作时间以显示正确的工作时间时遇到了一点问题。

这是我正在使用的代码:

<?php while($row = $approvedTimes->fetch()){ ?>
    <tr>
      <td><?php echo $row['userFirst'] . " ". $row['userLast'];  ?></td>
      <td><?php echo $row['companyName'];  ?></td>
      <td><?php echo date('Y-M-d',strtotime($row['timeDate']));  ?></td>
      <td><?php echo date("h:i a",strtotime($row['timeStart'])); $start = $row['timeStart'];  ?></td>
      <td><?php echo date("h:i a",strtotime($row['timeEnd'])); $end = $row['timeEnd'] ;  ?></td>
      <td><?php echo $row['timeBreak'] . " min."; $break = $row['timeBreak']; ?></td>
      <td><?php $hours = strtotime($end) - strtotime($start) -($break*60) ; echo  number_format($hours/3600,2, '.', '') . " hours"; ?></td>
    </tr>
    <?php } ?>

如果您注意到第二条记录输出 -17.50 小时,但工作小时数应为 6.5 小时。我认为问题在于它以秒为单位显示两次,但我不确定如何更改它以根据开始和结束时间显示正确的工作时间。

这是我输出的表格:

【问题讨论】:

  • 您必须为 strtotime() 提供完整的日期/时间。如果省略日期,则假定为“今天”。下午 5:30 是上午 12:30 之后,所以我假设他在第二天结束

标签: php


【解决方案1】:
您可以使用DateTime()DateInterval 类来实现这一点,而无需进行长时间的手动计算,如下所示。

注意: 这假定 $row['timeStart']$row['timeEnd'] 是有效的日期格式字符串,如 2016-07-23 08:15:30,并且 $row['timeBreak']分钟的 Number 休息时说:(例如 30 或 60)。
    <?php while($row = $approvedTimes->fetch()){ ?>
        <tr>
            <?php
                $start      = new DateTime($row['timeStart']);
                $end        = new DateTime($row['timeEnd']);
                $breakTime  = new DateInterval('PT'. $row['timeBreak'] .'M');

                // SUBTRACT THE BREAK TIME (IN MINUTES) FROM THE WORK-END TIME: $end  
                $end        = $end->sub($breakTime);

                // GET THE DIFFERENCE BETWEEN WORK-START TIME:$start & WORK-END TIME: $end  
                $timeDiff   = $end->diff($start);

                // BUILD A STRING TO REPRESENT THE DIFFERENCE USING SOME DateInterval METHODS.  
                $strDiff    = $timeDiff->h . " Hours, " . $timeDiff->i . " Minutes &amp; " . $timeDiff->s . " Seconds";
            ?>
            <td><?php echo $row['userFirst'] . " ". $row['userLast'];  ?></td>
            <td><?php echo $row['companyName'];  ?></td>
            <td><?php echo date('Y-M-d', strtotime($row['timeDate']));  ?></td>
            <td><?php echo date("h:i a", strtotime($row['timeStart']));  ?></td>
            <td><?php echo date("h:i a", strtotime($row['timeEnd']));   ?></td>
            <td><?php echo $row['timeBreak'] . " min."; ?></td>
            <td><?php echo $strDiff; /* ECHO OUT THE TOTAL HOURS WORKED...*/  ?></td>
        </tr>
    <?php } ?>

【讨论】:

    【解决方案2】:

    没有简短的答案,所以你必须使用这样的东西:

    $hours = strtotime($row['timeEndDate']." ".$row['timeEnd']) 
    - strtotime($row['timeStartDate']." ".$row['timeStart']) 
    -($break*60);
    

    但你也必须收集结束时间date

    正如 Lars Stegelitz 所说:您的月经可能是一夜之间!

    因此,在进行任何更改之前,请考虑将 timeStarttimeEnd 收集为完整的日期时间,而不仅仅是时间。

    如果您想对当前表执行此操作,则必须进行额外检查,例如:开始时间是否大于结束时间,然后对此做出反应(strtotime() with plus on day)

    How do I find the hour difference between two dates in PHP?

    Calculate number of hours between 2 dates in PHP

    【讨论】:

      【解决方案3】:

      相互减去完整的时间戳,以便 strtotime 看到日期变化。

      【讨论】:

        猜你喜欢
        • 2018-12-08
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2017-03-08
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多