在15分钟间隔和数组中的工作时间的PHP小时计算永远不会加起来

时间:2012-05-21 04:04:41

标签: php arrays

我有一个开始时间和结束时间,它始终以精确的一小时开始或结束: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分钟到很少...我已经尝试了几乎所有东西而且无法让它正常工作..

因此,例如,开始时间是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

我希望有人能在这里发光,谢谢!

任何?

1 个答案:

答案 0 :(得分:0)

更改此行:

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&lt; = 00:45,所以加15分钟
  • 第二次循环:00:45&lt; = 00:45,所以加15分钟

通过将<=更改为<,您可以删除第二个操作:00:45!&lt; 00:45所以不加任何东西。