从时间段中提取时间范围

时间:2013-07-10 07:54:07

标签: php

我正在创建一个应用程序,根据服务的时间使用情况向客户收费。问题是服务可以在一天的预定时间段内进行双重收费。

因此,假设我们提供打印文件服务,使用打印机的费用为每小时5欧元,早上23:00至02:00之间为10欧元。客户也可以按照自己喜欢的时间租用打印机。这可能是1分钟到几个月甚至几年。

现在具体问题:

假设客户来我办公室租用打印机55小时。租金也在晚上20:00开始。

因此,一次充电必须持续43小时,双重充电必须持续12小时。这是两个示例图像:

Example Picture enter image description here

现在,让我给你一些关于时间的额外信息。在编程中,每小时都有一个时间戳,它是从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

现在的问题是:

有没有办法从一个时间范围中提取双倍充电时间的持续时间?如果是,那么过程是什么?

2 个答案:

答案 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;

我测试了它并且它有效。希望它有所帮助。