如果是整小时,则为向下舍入时间;如果在php中超过整小时,则为向上舍入时间?

如果是整小时,则为向下舍入时间;如果在php中超过整小时,则为向上舍入时间?,php,date,datetime,Php,Date,Datetime,我试图计算服务的持续时间,以获得结束时间。每个服务都有一个以分钟为单位的持续时间值,这些值是:30,40,50 每节课在一整小时内开始(例如11:00、12:00、13:00) 如果总持续时间为一整小时(例如12:00、13:00、14:00),则应将其设置为前一小时和59分钟(例如11:59、12:59、13:59)。例如,如果选择了两个30分钟服务,则会发生这种情况 但是如果一个小时过去了,比如说结束时间是12:20或13:30,那么结束时间应该设置为12:59或13:59 以下是我目前的代

我试图计算服务的持续时间,以获得结束时间。每个服务都有一个以分钟为单位的持续时间值,这些值是:
30
40
50

每节课在一整小时内开始(例如11:00、12:00、13:00)

如果总持续时间为一整小时(例如12:00、13:00、14:00),则应将其设置为前一小时和59分钟(例如11:59、12:59、13:59)。例如,如果选择了两个30分钟服务,则会发生这种情况

但是如果一个小时过去了,比如说结束时间是12:20或13:30,那么结束时间应该设置为12:59或13:59

以下是我目前的代码:

$startTime = $_POST['datetime'];  //  (2015-09-09 11:00)

#   calculate total duration of services in order to get end time
    foreach($_POST['service'] as $service){
        list($service_id,$service_duration) = explode(';',$service);  //  values stored as id;duration
        $service_ids[] = (int)$service_id;  //  new array with ids
        $services_duration_total += (int)$service_duration;  //  in minutes
    }
//
#   calculate end time
    $endTime_actual = getdate(strtotime('+'.$services_duration_total.' minutes', strtotime($_POST['datetime'])));  //  actual end time
我试过这个方法:

$endTime_offset = (60-$endTime_actual['minutes'])-1;  //  calculate munutes left in the hour
$endTime = date('Y-m-d H:i',strtotime('+'.$endTime_offset.' minutes',$endTime_actual[0]));  //  new end time
如果总持续时间超过60分钟,则此方法有效,但如果正好是60分钟,或120或180分钟,则不起作用,因为它将在一个完整的小时内着陆。在这种情况下,正如我所提到的,我需要将脚本四舍五入到最后一小时59分钟


我不确定我是否正确地解释了这一点,但希望您能理解我的意图。

您可以减去1秒,然后将时间戳的“分钟”部分替换为固定的“59”:


这样,从12:01到13:00的所有结束时间都转换为12:59(这是我理解您的问题的方式)

尝试直接使用您的日期时间(或转换为日期时间):

可以根据日期时间的分钟值强制日期时间

$date = new DateTime('2001-01-01');

$date->setTime( $date->format('H'), 59);
您还可以使用以下命令强制执行前一小时:


希望这会有所帮助

这似乎有效。我不得不在
date
函数中的最后两个参数周围添加一个
strotime
,但之后,我运行了两个不同的测试。看起来不错。谢谢你的时间。哦,我不小心从代码中删除了strotime,现在修复了。顺便说一句。为什么
-1秒
?因为我在用分钟工作,使用
-1分钟
会有任何效果吗?出于好奇,我这么做只是为了遵守“整小时四舍五入”,所以12:00:01不会转换为11:59。由于您只工作满分钟,因此还可以使用-1分钟(或
$services\u duration\u total-1
)。啊。我懂了。谢谢你给我解释一下。
$date = new DateTime('2001-01-01');

$date->setTime( $date->format('H'), 59);