我正在创建一个应用程序,根据服务的时间使用情况向客户收费。问题是服务可以在一天的预定时间段内进行双重收费。
因此,假设我们提供打印文件服务,使用打印机的费用为每小时5欧元,早上23:00至02:00之间为10欧元。客户也可以按照自己喜欢的时间租用打印机。这可能是1分钟到几个月甚至几年。
现在具体问题:
假设客户来我办公室租用打印机55小时。租金也在晚上20:00开始。
因此,一次充电必须持续43小时,双重充电必须持续12小时。这是两个示例图像:
现在,让我给你一些关于时间的额外信息。在编程中,每小时都有一个时间戳,它是从1970年1月1日00:00:00到以秒为单位的时间。
因此日期 2012年7月5日11:15:40 的时间戳 1373022940 且日期 2012年7月5日11:15:50 时间戳 1373022950
在上面的示例中,我们假设第一个示例位于2013年5月1日,因此23:00的时间戳将为 1367449200 ,并且时间戳为3天后的02 :00早上 1367546400
现在的问题是:
有没有办法从一个时间范围中提取双倍充电时间的持续时间?如果是,那么过程是什么?
答案 0 :(得分:1)
没有测试过这个,但我希望它能让你走上正轨:
<?php
$price = 0;
$start_timestamp = 1367449200;
$end_timestamp = 1367546400;
$start_time_of_day = 1367449200 % (24*60*60); // Number of seconds from start of the day
$end_time_of_day = 1367546400 % (24*60*60); // Number of seconds from start of the day
// How much time the time period spends in the first day (in seconds)
$first_day_time = (24*60*60) - $start_time_of_day;
// How much time the time period spends in the last day (in seconds)
$last_day_time = (24*60*60) - $end_time_of_day;
$full_days_time = $end_timestamp + $last_day_time - ($start_timestamp + $first_day_time);
$full_days = round($full_days_time/(24*60*60));
// You can calculate by hand how much one full 24-hour day from 00:00 to 00:00 costs
$price += $full_days * (2*10 + 21*5 + 1*10);
// so now the difficulty is the pieces of time on the first day and the last day.
$expensive_time = 0; // Expensive time spent on the first and last day
$cheap_time = 0;
if ($start_time_of_day<2*60*60)
{
// Renting starts before 02:00
$expensive_time += 2*60*60 - $start_time_of_day;
$cheap_time += 21*60*60; // Full 21 hours of cheap time
$expensive_time += 1*60*60; // 1 hour of expensive time from 23:00 to midnight
}
elseif ($start_time_of_day<23*60*60)
{
// Renting starts after 02:00 and before 23:00
$cheap_time += 23*60*60 - $start_time_of_day;
$expensive_time += 1*60*60; // 1 hour of expensive time from 23:00 to midnight
}
else
{
// Renting starts after 23:00
$expensive_time += 24*60*60 - $start_time_of_day;
}
// !! Use a similar strategy for the $end_time_of_day here
$price += ceil($expensive_time/60/60) * 10;
$price += ceil($cheap_time/60/60) * 5;
echo $price." euro";
?>
答案 1 :(得分:1)
当然有。你只需要计算日期之间的间隔。
假设有人从8:00开始使用服务,并在16:00结束。
价格从8:00到16:00 = 2 $ 价格从16:00到8:00 = 1 $
因此,您需要将使用时间的开始和使用时间的结束转换为时间戳
date_default_timezone_set('UTC');
$day_start = '2011-06-22';
$day_end = '2011-06-22';
$start_usage = strtotime($day_start.' 8:00');
$end_usage = strtotime($day_end.' 17:00');
$price_low_rate = 1; //price for using service 16-8
$price_high_rate = 2; // price for using service since 8-16
$fee_for_eight_sixteen = 0; // total price for using service since 8-16
$fee_for_sixteen_eight = 0; // total price for using service 16-8
if($end_usage >strtotime($day_start.' 16:01'))
{
$fee_for_sixteen_eight = ($end_usage - strtotime($day_end.' 16:00'))/3600 * $price_low_rate;
}
if($start_usage >= strtotime($day_start.' 8:00'))
{
$fee_for_eight_sixteen = (strtotime($day_end.' 16:00') - $start_usage)/3600 * $price_high_rate;
}
echo $fee_for_eight_sixteen.' - '.$fee_for_sixteen_eight;
我测试了它并且它有效。希望它有所帮助。