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

Discussion in '请您翻译' started by liujiaqi, Jun 11, 2009.

  1. li

    liujiaqi Member

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

    znxia Member

    Apr 1, 2015
    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元/小时可能存在一些小的错误,你就根据数据调试跟踪再看吧。
     
  3. li

    liujiaqi Member

    Apr 1, 2015
    楼上的朋友能否留下QQ号
     
  4. zn

    znxia Member

    Apr 1, 2015
  5. li

    liujiaqi Member

    Apr 1, 2015
    查无此号, 是不是长了点
     
  6. zn

    znxia Member

    Apr 1, 2015
    难怪没人找我,原来有qq号却查找不到,我更改设置了,你再查一下
     
  7. li

    liujiaqi Member

    Apr 1, 2015
    谢谢啦,兄弟