首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算给定时间段内两个日期间的小时数。

计算给定时间段内两个日期间的小时数。
EN

Stack Overflow用户
提问于 2014-04-10 10:55:08
回答 1查看 412关注 0票数 0

我有一个预订系统,用户可以随时预订房间,而且可以连续预订几天。预订的费用取决于房间使用的分钟数。

在预订系统中,开始时间和结束时间由两个时间戳表示。例如:

代码语言:javascript
复制
start_time = 1397124000
end_time = 1397129400

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

我的问题是,我想计算出在高峰时段-早上8点之前和下午6点以后的任何预订都有50%的折扣。预订时间可以跨越这些时间(即上午7时至上午9时),因此应该贴现适当的比例(上午7点至8点的预订部分有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小时折扣)。

目前,试图计算出预订的比例是在这些上午8点前,下午6点后的折扣期间,只有一个开始和结束的时间戳是非常困难的。

我的代码是一个非常大的系列ifelse语句,针对开始和结束时间进行测试,但是它对跨越超过一天的预订并不健壮,而且在其他方面非常混乱。

我正在寻找一种方法,它可以很容易地计算出在一段折扣时间内预订的比例,它可以解释所有可能的情况。一个难题!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-10 12:08:07

在考虑了许多方案之后,我终于想到了下面的解决方案。

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

代码语言:javascript
复制
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分钟窗口是否在折扣期内--如果是的话,它会增加折扣分钟计数器,如果不是,则增加非折扣分钟计数器。最后,他们只是根据分钟数来计算成本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22986011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档