如果是整小时,则为向下舍入时间;如果在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);