用PHP正确减去时间

用PHP正确减去时间,php,postgresql,time,subtraction,Php,Postgresql,Time,Subtraction,我使用了一些表单来确定用户工作的持续时间,以及他们工作的加班时间。问题是,我想知道有多少小时可以在加班和多少是正常时间计费。现在很明显,从总时间中减去加班时间,但是我使用以下脚本来获得时间量: $logtime = new CGenRs("SELECT time_id, profile_id , user_number , start_time , end_time, description, exported,ovt_start_time,ovt_end_time, E

我使用了一些表单来确定用户工作的持续时间,以及他们工作的加班时间。问题是,我想知道有多少小时可以在加班和多少是正常时间计费。现在很明显,从总时间中减去加班时间,但是我使用以下脚本来获得时间量:

$logtime = new CGenRs("SELECT time_id,
  profile_id ,
  user_number ,
  start_time ,
  end_time,
  description,
  exported,ovt_start_time,ovt_end_time, EXTRACT(hour FROM(end_time - start_time)) as diff,EXTRACT(minute FROM(end_time - start_time))as difference,EXTRACT(hour FROM(ovt_end_time-ovt_start_time)) as ovt_diff,EXTRACT(minute FROM(ovt_end_time-ovt_start_time)) as ovt_difference from adapt_profile_time where exported = 'f' order by user_number", $cao);
$logtime->first();
提取功能可以很好地显示时间,但当我开始减去它时,它会变得有点混乱

$tot_mins = 0;
            $ovt_mins = 0;
        }
        $tot_mins = ($tot_mins + $logtime->valueof('diff') * 60) + $logtime->valueof('difference');
        $ovt_mins = ($ovt_mins + $logtime->valueof('ovt_diff') * 60) + $logtime->valueof('ovt_difference');
    $total_test= floor(($tot_mins / 60)-($ovt_mins / 60))." hours ".(($tot_mins % 60)-($ovt_mins % 60))." minutes ";
当使用echo$total_测试时会进行计算,但如果用户工作了7小时0分钟(包括3小时40分钟的加班时间),则上述计算的结果返回3小时-40分钟。这是错误的。 那么我在这里哪里出了问题

我相信问题在于提取时间和分钟与“-”“+”操作符的工作不好。我在表中添加了一个总列,将总时间与加班时间相加(应该减去,但我这样做是为了测试),我使用了以下代码:

<td><?php echo ($logtime->valueof('diff')   +  $logtime->valueof('ovt_diff')) . " " . "hours" . " ".(($logtime->valueof('difference') + $logtime->valueof('ovt_difference')))." "."minutes"  ?></td>


结果很有趣。如果用户工作3小时50分钟,其中全部是加班,则返回的结果是6小时100分钟。因此,添加工作正常,只是时间格式中的值无法识别,正如我在评论中所述,明智的做法是将这些类用于您想要执行的任何日期/时间操作。包括获得时间差

看看这个例子:

// Create two new DateTime-objects...
$Date1 = new DateTime('2015-10-21T8:00:00');
$Date2 = new DateTime('2015-10-21T18:30:00');

// The diff-methods returns a new DateInterval-object...
$Diff = $Date2->diff($Date1);

// Call the format method on the DateInterval-object
echo $Diff->format('%h:%i');
上述代码的输出应为“10:30”


从这里开始,你可以简单地得到时间差,并检查是否超过8小时。如果是的话,你可以得到你的加班费。

我终于让它工作了。我将查询更改为以下内容:

$logtime = new CGenRs("SELECT time_id,
  profile_id ,
  user_number ,
  start_time ,
  end_time,
  description,
  exported,ovt_start_time,ovt_end_time, EXTRACT(hour FROM(end_time - start_time)) as diff,EXTRACT(minute FROM(end_time - start_time))as difference ,EXTRACT(hour FROM(ovt_end_time-ovt_start_time)) as ovt_diff,EXTRACT(minute FROM(ovt_end_time-ovt_start_time)) as ovt_difference,EXTRACT(EPOCH FROM (end_time - start_time)) as super,EXTRACT(EPOCH FROM (ovt_end_time - ovt_start_time)) as spar FROM adapt_profile_time where exported = 'f' order by user_number", $cao);
$logtime->first();
$tot_mins = 0;
    $ovt_mins = 0;
    $total_mens = ($logtime->valueof('super') /60 ) + ($logtime->valueof('spar')/60);


    while (!$logtime->eof()) {
        while (!$logtime->eof()) {


            if ($curr_userno != $logtime->valueof('user_number')) {
                $total_time = floor($tot_mins / 60) . " hours " . ($tot_mins % 60) . " minutes";
                $total_ovt = floor($ovt_mins / 60) . " hours " . ($ovt_mins % 60) . " minutes";
                $total_test = floor($total_mens/60)." hours ".($total_mens%60). " minutes";
如您所见,我在查询中添加了
提取
历元
,用于随时间变化和总工作时间

然后我添加了下一段代码:

<td><?php $epoch_1 = $logtime->valueof('super');
                $epoch_2 = $logtime->valueof('spar');
                $diff_seconds = $epoch_1 - $epoch_2;
                $diff_weeks = floor($diff_seconds / 604800);
                $diff_seconds -= $diff_weeks * 604800;
                $diff_days = floor($diff_seconds / 86400);
                $diff_seconds -= $diff_days * 86400;
                $diff_hours = floor($diff_seconds / 3600);
                $diff_seconds -= $diff_hours * 3600;
                $diff_minutes = floor($diff_seconds / 60);
                $diff_seconds -= $diff_minutes * 60;
                echo $diff_hours." "."hours ".$diff_minutes." minutes" ?></td>
                <td>

现在它开始工作了。这些值正完美地相加,并在必要时继续使用。

我的第一个猜测是,您没有正确使用日期函数。postgresql应该能够直接从一个日期中减去两个日期。结果应该类似于一个间隔。另一方面,提取从日期中提取一部分,如小时部分。所以我猜你的问题部分是基于这个。也许这个相关的问题能帮助你我同意约书亚的观点。您应该能够使用数据库执行此操作。但是,如果您想在php中实现这一点,您确实需要查看DateTime对象和方法。你自己计算日期,这是相当令人不安的。例如,请查看。@Joshua感谢大家,现在通读它们,将简短地发布一个解决方案。我的想法是,我应该让我的SQL进行计算。基本上,让它返回一个时间戳差异,然后在php中编辑格式。我一工作就会发布结果。这是最好的选择。我用PHP给出了我的答案,因为这正是你所问的,但我的一般经验法则是尽可能始终使用数据库的函数。是的,谢谢你的回答。它让我研究了PHP的DateTime类,直到现在我才意识到它有多么强大,这真是太好了:)我已经看到太多的人在日期/时间计算上苦苦挣扎,而有些类让它变得如此简单。祝你好运!:)