我有一个预订系统,用户可以随时预订房间,而且可以连续预订几天。预订的费用取决于房间使用的分钟数。
在预订系统中,开始时间和结束时间由两个时间戳表示。例如:
start_time = 1397124000
end_time = 1397129400由此我可以计算出预定的秒数,从而计算出一个费用。
我的问题是,我想计算出在高峰时段-早上8点之前和下午6点以后的任何预订都有50%的折扣。预订时间可以跨越这些时间(即上午7时至上午9时),因此应该贴现适当的比例(上午7点至8点的预订部分有50%的折扣)。
我的计算代码变得非常混乱和复杂,因为有几种场景:
目前,试图计算出预订的比例是在这些上午8点前,下午6点后的折扣期间,只有一个开始和结束的时间戳是非常困难的。
我的代码是一个非常大的系列if和else语句,针对开始和结束时间进行测试,但是它对跨越超过一天的预订并不健壮,而且在其他方面非常混乱。
我正在寻找一种方法,它可以很容易地计算出在一段折扣时间内预订的比例,它可以解释所有可能的情况。一个难题!
发布于 2014-04-10 12:08:07
在考虑了许多方案之后,我终于想到了下面的解决方案。
我编写了一个函数,每隔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分钟窗口是否在折扣期内--如果是的话,它会增加折扣分钟计数器,如果不是,则增加非折扣分钟计数器。最后,他们只是根据分钟数来计算成本。
https://stackoverflow.com/questions/22986011
复制相似问题