我有一个预订系统,用户可以随时预订房间,连续几天。预订将根据客房使用的分钟数收取。
在预订系统中,开始和结束时间由两个时间戳表示。 e.g。
start_time = 1397124000
end_time = 1397129400
由此我可以计算预订的秒数,从而计算出费用。
我遇到的问题是,我想计算出高峰时段预订的50%折扣 - 早上8点之前和下午6点之后。可以在这些时间(即早上7点至9点)进行预订,因此适当的比例应该打折(在7-9am预订的7-8am部分享受50%的折扣)。
我的计算代码变得非常混乱和复杂,因为有几种情况:
目前尝试计算预订的比例是在上午8点之前,下午6点后的折扣期间,只提供开始和结束时间戳是非常困难的。
我的代码是一系列非常大的if
和else
语句,用于测试开始和结束时间,但它对于超过一天的预订并不是很强大,而且非常混乱。
我正在寻找一种方法,可以轻松计算预订在折扣时间内的比例,这可以解释所有可能的情况。一个难题!
答案 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分钟窗口是否在折扣期内 - 如果是,它会增加折扣分钟计数器,或者如果没有,则增加非折扣分钟计数器。最后,它们仅根据分钟数计算成本。