请大家写个简单的的代码, 分时段计费, 在线等待, 300分给光(300)

liujiaqi

New Member
Member
#1
我现在在写一个棋牌室系统, 有一个房间计费功能, 时间段分三段, 但开始时间和结束时间是由用户自己定义, 比如说:时间段一: 08:00 - 16:30 15元/小时时间段二: 16:30 - 24:00 20无/小时 时间段三: 24:00 - 08:00 10元/小时 以上时间段和费用我只是举个例子, 实际还是由用户来调的, 现在开房时间有很多种情况, 有可能跨两个区段, 或三个区段,也有可能跨天, 一两天都有可能, 想请大家写一个简单的算法来计费从开房时间到退房时间的费用是多少, 按10分钟开始计算, 不足10分钟算10分钟,请大家帮个忙写个简单的例子, 300分全给.
 

znxia

New Member
Member
#2
uses DateUtils, Math;Type _TimeSeg=record StarTime:TDateTime;
//开始时间 EndTime:TDateTime;
//结束时间 Price:Double;
//价格 (元/小时) end;
ArrTimeSeg = Array of _TimeSeg;
//由其它地方初始化,表示每个时间段内的价格信息,开始时间由小到大排序好Var gTimeSeg:ArrTimeSeg;function CalcFee(InTime,OutTime:TDateTime):Double;var I, Diff:Integer;
Index:Integer;
st1,st2:TDateTime;
t1,t2:TDateTime;
begin
Result:=0;
Diff:= MinutesBetween(OutTime,InTime);
if Diff<10 then
IncMinute(OutTime, 10-Diff);
//不足十分钟按10分钟计算 Index:=-1;
st1:=InTime -Trunc(InTime);
//只取开始时间的时间部分 st2:=OutTime - Trunc(InTime);
//相对于开始日的时间 //查找开始时间段 for i:=Low(gTimeSeg) to High(gTimeSeg)do
if (gTimeSeg.StarTime<=st1) and (st1<gTimeSeg.EndTime) then
Index:=I;
//开始分段计算 while Truedo
begin
t1:=Max(gTimeSeg[Index].StarTime,st1);
t2:=Min(gTimeSeg[Index].EndTime,st2);
if t2<=t1 then
Break;
Result := Result + RoundTo(HourSpan(t2,t1) * gTimeSeg[Index].Price,2);
Inc(Index);
if Index>High(gTimeSeg) then
begin
Index:=0;
st2:=st2-1;
st1:=0;
end;
end;
end;
//时间段三: 24:00 - 08:00 10元/小时//需要更改为 00:00 - 08:00 10元/小时可能存在一些小的错误,你就根据数据调试跟踪再看吧。
 

Users Who Are Viewing This Thread (Users: 1, Guests: 0)