计算两个日期时间之间给定时间范围内的小时数

时间:2014-04-10 10:55:08

标签: php datetime timestamp mathematical-optimization

我有一个预订系统,用户可以随时预订房间,连续几天。预订将根据客房使用的分钟数收取。

在预订系统中,开始和结束时间由两个时间戳表示。 e.g。

start_time = 1397124000
end_time = 1397129400

由此我可以计算预订的秒数,从而计算出费用。

我遇到的问题是,我想计算出高峰时段预订的50%折扣 - 早上8点之前和下午6点之后。可以在这些时间(即早上7点至9点)进行预订,因此适当的比例应该打折(在7-9am预订的7-8am部分享受50%的折扣)。

我的计算代码变得非常混乱和复杂,因为有几种情况:

  1. 预订在折扣期间开始和结束(例如凌晨3点至早上7点 - 打折4小时)
  2. 预订在折扣期间开始,但之后结束(例如上午7点至9点 - 打折1小时)
  3. 预订在非折扣期间(上午10点至下午5点 - 无折扣)开始和结束
  4. 预订在非折扣期间开始,但之后结束(下午5点至晚上10点 - 打折1小时)
  5. 预订涵盖整个前期折扣期间(上午2点至晚上10点 - 折扣10小时)或更复杂(第1天凌晨2点至第5天晚上10点 - 折扣50小时)。
  6. 目前尝试计算预订的比例是在上午8点之前,下午6点后的折扣期间,只提供开始和结束时间戳是非常困难的。

    我的代码是一系列非常大的ifelse语句,用于测试开始和结束时间,但它对于超过一天的预订并不是很强大,而且非常混乱。

    我正在寻找一种方法,可以轻松计算预订在折扣时间内的比例,这可以解释所有可能的情况。一个难题!

1 个答案:

答案 0 :(得分:0)

在思考了很多选项后,我最终遇到了以下解决方案。

我写了一个函数,以30分钟的间隔浏览预订开始和结束时间,检查每次是否在折扣期内:

function discount_period($timestamp) {
    $lowerTime = mktime (8,0,0,date("n", $timestamp), date("j", $timestamp), date("Y", $timestamp));
    $upperTime = mktime (18,0,0,date("n", $timestamp), date("j", $timestamp), date("Y", $timestamp));
    if (($timestamp < $lowerTime) || ($timestamp >= $upperTime)) {
            return true;
    }
    else {
            return false;   
    }
}

$discountmins = 0;
$nondiscountmins = 0;

for ($i = strtotime($billingResult->start_time); $i < strtotime($billingResult->end_time); $i += 1800) {
    if (discount_period($i)) {
        // This is within a discount period of at least 30 minutes
        $discountmins += 30;
    }
    else {
        $nondiscountmins +=30;  
    }
}
$discountedcost = ((($discountmins / 60) * $billingResult->cost_per_hr) * 0.5) / 100;
$nondiscountcost = (($nondiscountmins / 60) * $billingResult->cost_per_hr) / 100;

因此,它基本上会检查下一个30分钟窗口是否在折扣期内 - 如果是,它会增加折扣分钟计数器,或者如果没有,则增加非折扣分钟计数器。最后,它们仅根据分钟数计算成本。