1

我正在创建一个应用程序,该应用程序根据服务的使用时间向客户端收费。问题是服务可以在一天中预先指定的时间段内收取双倍费用。

因此,假设我们有一项打印文档的服务,使用打印机的费用为每小时 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,三天后凌晨 02:00 的时间戳为1367546400

现在的问题:

有没有办法从时间框架中提取双重收费小时的持续时间?如果有,流程是什么?

4

2 回答 2

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";
?>
于 2013-07-10T08:14:06.557 回答
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;

我已经对其进行了测试,并且可以正常工作。希望能帮助到你。

于 2013-07-10T08:18:03.710 回答