当前位置:编程学习 > C#/ASP.NET >>

房费如何计算

--------------------编程问答-------------------- 你只说了结束条件,begintime呢? --------------------编程问答-------------------- begintime应该是入住时间吧 --------------------编程问答-------------------- 开始时间都没有!!! --------------------编程问答--------------------
/*
 * Created by SharpDevelop.
 * User: ChangLiang Li
 * Date: 2010-4-14
 * Time: 21:08
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

namespace CSharpConsole
{
class Program
{
public static void Main(string[] args)
{

// TODO: Implement Functionality Here
Console.WriteLine(GetTT(new DateTime(2002,1,1,8,0,0),new DateTime(2002,1,1,9,0,0)));
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
public static double GetTT(DateTime  begintime, DateTime endtime)
{
double time=0.0;
TimeSpan ts1 = new TimeSpan(begintime.Ticks);
            TimeSpan ts2 = new TimeSpan(endtime.Ticks);
            time+=ts2.Subtract(ts1).Days==0?1:ts2.Subtract(ts1).Days;
            int hour=endtime.Hour;
            if(hour<14) return time;
             else
             if(hour<18) return time+0.5;
               else return time+1.0;
}

}
}

还有什么问题? --------------------编程问答-------------------- TimeSpan objTimeSpan=现在时间-开始时间
得到objTimeSpan的总小时数
然后用这个总小时数 去除24  留下余数  
加上条件判断
--------------------编程问答-------------------- 感谢 LCL_data 

你的代码我现在试试,好用联系你~~~~ --------------------编程问答--------------------
/*
 * Created by SharpDevelop.
 * User: ChangLiang Li
 * Date: 2010-4-14
 * Time: 21:08
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

namespace CSharpConsole
{
class Program
{
public static void Main(string[] args)
{

// TODO: Implement Functionality Here
Console.WriteLine(GetTT(new DateTime(2002,1,1,8,0,0),new DateTime(2002,1,1,13,0,0)));
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
public static double GetTT(DateTime  begintime, DateTime endtime)
{
double time=0.0;
TimeSpan ts1 = new TimeSpan(begintime.Ticks);
            TimeSpan ts2 = new TimeSpan(endtime.Ticks);
            time+=ts2.Subtract(ts1).Days;
            if(time<1.0) return 1.0; //不到一天
            else{
            int hour=endtime.Hour;
            if(hour<14) return time;
             else
             if(hour<18) return time+0.5;
               else return time+1.0;
            }
}

}
}
--------------------编程问答-------------------- To LCL_data

你好,你的代码我试了下,有问题  

如 begintime 是 "2010/4/14 22:00:00"
如 endtime 是 "2010/4/15 15:00:00"

仍然返回 1.0

应该返回的是 1.5 --------------------编程问答--------------------
/*
 * Created by SharpDevelop.
 * User: ChangLiang Li
 * Date: 2010-4-14
 * Time: 21:08
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

namespace CSharpConsole
{
class Program
{
public static void Main(string[] args)
{

// TODO: Implement Functionality Here
Console.WriteLine(GetTT(new DateTime(2002,1,1,22,0,0),new DateTime(2002,1,2,12,0,0)));
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
public static double GetTT(DateTime  begintime, DateTime endtime)
{
double time=0.0;
time=endtime.Day-begintime.Day;           
            if(time<1.0) return 1.0; //不到一天
            else{
            int hour=endtime.Hour;
            if(hour<14) return time;
             else
             if(hour<18) return time+0.5;
               else return time+1.0;
            }
}

}
}
--------------------编程问答-------------------- 没过夜咋算啊,比如:10点入住,下午2点又走人! --------------------编程问答-------------------- 还是把开始时间做个详细的分析,在写程序就思路清晰啦! --------------------编程问答--------------------
引用 10 楼 sxldfang 的回复:
没过夜咋算啊,比如:10点入住,下午2点又走人!

9楼的 我是算一天的
实际中也算一天吧 --------------------编程问答-------------------- To LCL_data

感谢你写了这么多,但仍然有问题
 
如 begintime 是 "2010/4/14 22:00:00"
如 endtime 是 "2010/4/15 12:00:00"

返回 0 了

应该返回的是 1.0 --------------------编程问答--------------------
引用 13 楼 yeeloge 的回复:
To LCL_data

感谢你写了这么多,但仍然有问题
 
如 begintime 是 "2010/4/14 22:00:00"
如 endtime 是 "2010/4/15 12:00:00"

返回 0 了

应该返回的是 1.0

9楼的代码返回1的 --------------------编程问答-------------------- 今天上午9点入住,明天12点走人 --------------------编程问答--------------------
引用 15 楼 soaringbird 的回复:
今天上午9点入住,明天12点走人

实际应该是多少?
1,不多? --------------------编程问答-------------------- 如果 上午9点入住,明天12点走人 

没有超过14点应该是 1  超过14点就1.5 超过18点就2

再过一天到14点前也是2,超过14点就2.5 超过18点就3 以此类推~~~~~



--------------------编程问答-------------------- --------------------编程问答-------------------- 这问题逻辑非常简单,不过你不要用程序员惯常的思维去思考...

给你个提示...你这里不是“时间段”的概念,而是“时间点”的概念...所以除了14点、18点和0点三个时间点之外其他“时间”数据都是无用的,你只需要关心日期和那三个时间点... --------------------编程问答-------------------- 睡前最后一帖...当天按1天处理...
public double GetTT(DateTime begintime, DateTime endtime)
{
    if (begintime >= endtime)
        throw new ArgumentOutOfRangeException("begintime");

    double result = 1;

    //租住天数...不要时间,无用...
    int days = (endtime.Date - begintime.Date).Days;

    //当天退房
    if (days < 1)
        return result;

    //退房当天租住小时数...其他时间数据都无用...
    int hours = (endtime - endtime.Date).Hours;

    switch (hours)
    {
        //14:00-18:00退房
        case 14:
        case 15:
        case 16:
        case 17:
            result = days + 0.5;
            break;
        //18:00后退房
        case 18:
        case 19:
        case 20:
        case 21:
        case 22:
        case 23:
            result = days + 1;
            break;
        //14:00前退房
        default:
            result = days;
            break;
    }

    return result;
}
--------------------编程问答-------------------- 明明就是基本数学题? --------------------编程问答-------------------- 对了,你想付报酬的话就给青海灾民捐点儿款吧... --------------------编程问答-------------------- 完全同意vrhero老兄的算法
其实有些看上去很复杂的计算,如果把逻辑关系理顺了,计算方法非常简单
附加一句:vrhero是个有爱心的人,楼主应该按照他说的做 --------------------编程问答--------------------
引用 22 楼 vrhero 的回复:
对了,你想付报酬的话就给青海灾民捐点儿款吧...

恩,我9楼的算法就是这个意思。。。
你的switch是不是有点冗余?我的if代码少很多啊,呵呵 --------------------编程问答-------------------- --------------------编程问答--------------------

没那么麻烦,看看这个:

        static double ppp1(DateTime begin,DateTime end)
        {
            double d = end.Day - begin.Day;
            if (d < 1) d = 1;
            int h = end.Hour;
            if (h < 14) return d;
            if (h < 18) return d + 0.5;
            return d + 1;
        }
--------------------编程问答-------------------- 小小的程序,思路打开了,就不那么麻烦了~ --------------------编程问答-------------------- 不懂,我不专业 --------------------编程问答-------------------- 好哦,可以稍加注释,返回值定义为一个变量吧,不然楼主会晕……

引用 26 楼 sxldfang 的回复:
C# code

没那么麻烦,看看这个:

        static double ppp1(DateTime begin,DateTime end)
        {
            double d = end.Day - begin.Day;
            if (d < 1) d = 1;
            int h = end.Hour;
……
--------------------编程问答-------------------- 以解决了 --------------------编程问答-------------------- 这个应该是个天加点数的判断..没有楼主想像的那么难吧.?
退房时间减入住时间的天数,加上退房时间点数的判断! --------------------编程问答-------------------- 这个程序难点不在这儿,应该是PC的判断,加上人为的变动操作,才是你这个需求的关键.....

就如程序判断是三天.你感觉打电话通知退房了.结算时间...意思外的情况下..程序怎么统计,这是难做的... --------------------编程问答-------------------- #9L的好想知道你的思路,26L的真的比较简练.... --------------------编程问答-------------------- up...see --------------------编程问答--------------------
引用 24 楼 lcl_data 的回复:
引用 22 楼 vrhero 的回复:

对了,你想付报酬的话就给青海灾民捐点儿款吧...

恩,我9楼的算法就是这个意思。。。
你的switch是不是有点冗余?我的if代码少很多啊,呵呵

代码只是个例子,用switch相当清晰而且非常容易扩展...

ps:26楼的代码根本就不合格,不同月份必然出错,会被PM骂死... --------------------编程问答--------------------
引用 35 楼 vrhero 的回复:
ps:26楼的代码根本就不合格,不同月份必然出错,会被PM骂死...

言之有理,考虑的简单啦! --------------------编程问答-------------------- 哪位大哥写个完整的代码啊,谢谢啦~~~~~~


能解决问题就行,搞定我立马打车去捐钱~~~~~~~~~~~~~~~~~~~~~~~~ --------------------编程问答--------------------
引用 37 楼 yeeloge 的回复:
哪位大哥写个完整的代码啊,谢谢啦~~~~~~


能解决问题就行,搞定我立马打车去捐钱~~~~~~~~~~~~~~~~~~~~~~~~

你为什么不动手写写,有不会的地方我们可以帮助下
--------------------编程问答--------------------
引用 35 楼 vrhero 的回复:
引用 24 楼 lcl_data 的回复:
引用 22 楼 vrhero 的回复:

对了,你想付报酬的话就给青海灾民捐点儿款吧...

恩,我9楼的算法就是这个意思。。。
你的switch是不是有点冗余?我的if代码少很多啊,呵呵

代码只是个例子,用switch相当清晰而且非常容易扩展...

ps:26楼的代码根本就不合格,不同月份必然出错,会被PM骂死...

月份没算。。 --------------------编程问答-------------------- 代码好写,但是你要找你给做项目的那家酒店的人问问天数到底应该怎么算,有些特殊的时段,不同酒店的计算方式是不一样的,还曾经发生过顾客入住11个小时收一天半房费的事,所以还是问清楚的好。 --------------------编程问答-------------------- 比如说凌晨几点前入住算昨天,几点后算今天,以及你所说的晚退房怎么加钱,等等。 --------------------编程问答-------------------- 这个开源编译器不支持格式化代码
。。月份考虑了
/*
 * Created by SharpDevelop.
 * User: ChangLiang Li
 * Date: 2010-4-14
 * Time: 21:08
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

namespace CSharpConsole
{
    class Program
    {
        public static void Main(string[] args)
        {
            
            // TODO: Implement Functionality Here
            Console.WriteLine(GetTT(new DateTime(2002,1,1,13,0,0),new DateTime(2002,2,1,12,0,0)));
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
        public static double GetTT(DateTime  begintime, DateTime endtime)
        {
            double time=0.0;           
            time= begintime.Subtract(endtime).Days;
            if(time<0) time=-time;
            if(endtime.Hour<begintime.Hour) time++;
            if(time<1.0) return 1.0; //不到一天
            else{
            int hour=endtime.Hour;
            switch (hour)
              {
         //14:00-18:00退房
         case 14:
         case 15:
         case 16:
         case 17:
            return  time + 0.5;           
         //18:00后退房
        case 18:
        case 19:
        case 20:
        case 21:
        case 22:
        case 23:
            return time + 1;            
        //14:00前退房
        default:
            return time;
           
    }
            }
        }

    }
}
--------------------编程问答--------------------

static double GetDays(DateTime startTime, DateTime endTime)
        {
            DateTime startDate = startTime.Date;
            if (startTime.Hour < 4) //凌晨4点前入住算前一天
                startDate = startDate.AddDays(-1);
            DateTime endDate = endTime.Date;
            double days = (endDate - startDate).Days;
            if (endTime.Hour >= 18) //18点后退房
            {
                days = days + 1;
            }
            else if (endTime.Hour >= 14)  //14点后退房
            {
                days = days + 0.5;
            }
            return days;
        }
--------------------编程问答-------------------- keyi --------------------编程问答--------------------
引用 43 楼 soaringbird 的回复:

错了,少算当天上午入住,当天上午退的。


static double GetDays(DateTime startTime, DateTime endTime)
        {
            DateTime startDate = startTime.Date;
            if (startTime.Hour < 4) //凌晨4点前入住算前一天
                startDate = startDate.AddDays(-1);
            DateTime endDate = endTime.Date;
            double days = (endDate - startDate).Days;
            if (endTime.Hour >= 18) //18点后退房
            {
                days = days + 1;
            }
            else if (endTime.Hour >= 14)  //14点后退房
            {
                days = days + 0.5;
            }
            if (days < 0.1)
                days = 1;
            return days;
        }
--------------------编程问答--------------------
引用 37 楼 yeeloge 的回复:
哪位大哥写个完整的代码啊,谢谢啦~~~~~~


能解决问题就行,搞定我立马打车去捐钱~~~~~~~~~~~~~~~~~~~~~~~~


把前面的代码都看看,可以解决问题啦。还没思路的话,怎么跟人家编程啊,o(∩_∩)o...哈哈 --------------------编程问答-------------------- 现在所有问题解决了,就卡在这个地方了,

我现在脑子一团糟,乱七八糟的,好心的大哥们,帮帮俺吧,写个完整的代码行吗?

条件很简单,

主要是每天14点为一个结点,超过了到18点为加半天,超过18点加一天,

--------------------编程问答-------------------- 先留言,接着帮你想 --------------------编程问答--------------------

楼主,给分吧:
        static double ppp1(DateTime begin,DateTime end)
        {
            double d = (end.Date - begin.Date).Days;
            if (d < 1) d = 1;
            int h = end.Hour;
            if (h < 14) return d;
            if (h < 18) return d + 0.5;
            return d + 1;
        }

--------------------编程问答-------------------- \\宾馆软件时间,一定有开厢费,有的半天起,有的一天起

\\建议直接在数据库中处理比较好。

\\另外一个建议是累加制,就是过14点所有房费全部加上半天,过18点再加半天,这样做的好处是适合钟点房,可以扩展多卖几家店,呵呵。 --------------------编程问答-------------------- 每天恢复即可得分 --------------------编程问答-------------------- 补充下,如果是累加制开厢的第一个时间点的费用不要累加 --------------------编程问答-------------------- mark --------------------编程问答--------------------
引用楼主 yeeloge 的回复:
简单的说就是两个时间段,能得到是1天还是1天半,还是两天,以此类推

条件:
14点前结账算一天(返回1),超过14点,到18点前结账加收半天(返回1.5)
超过18点算两天(返回2)


(题外话:现在结账时间是14点了?以前老是12点,每次14点左右的火车,到了12点就不知道如何是好,退房吧,拉着行李箱满街转悠,不退房吧,多花半天房费蛮心疼~,14点好点。)

之所以你对这个问题感到困惑,之所以以上答案总感觉和显示不符,是因为没有考虑到入住的时间点begintime。比如说1号的0:1分住,和1号的23:59分入住,到2号的13:0退房,我们依据显示行规很容易得出前者是两天,后者是一天。但是,比如说1号的5:1分入住,到2号的13:0退房,是几天?3:1分入住呢?10:1分入住呢?依据现实行规,我觉得如果1号3:1分入住,到2号的13:0退房,应该算两天;如果1号10:1分入住,到2号的13:0退房,应该算一天,这两者显然是有区别的,并且是可以理解的;


这个问题我觉得先要列出入住和退房的hour的关键点。

首先是退房hour的关键点:是否>=0 &&<=14.是否>14 &&<=18.是否>18 &&<=24.

2、入住hour的关键点:

综上所述,你这个需求有一点不清,就是入住的hour的关键点。我觉得入住hour关键点应该是早上起床的时间,或者早一点,早上6点。或者再稍微晚一点,比如说早上9点或者10点。姑且我们先确定begintime=6.
begintime时间出来了,这个问题就好办了。

是否>=0 &&<=6.是否>6 &&<24.

hour的关键点不清,你需要落实。

3、然后再分别讨论各种情况下的diffday。

(未完待续~)


【如果我的回答能够给你一些启示的话,请到下列地址,原创:“金点家庭记账簿2.0”,简单实用,逻辑缜密,考虑周到,欢迎工薪阶层、家庭主妇下载,http://download.csdn.net/source/2247484 你的下载使用并给出宝贵意见只会增加我继续下去的积极性!其实其他我别无所求】 --------------------编程问答--------------------
引用 5 楼 sxiaohui8709253 的回复:
TimeSpan objTimeSpan=现在时间-开始时间
得到objTimeSpan的总小时数
然后用这个总小时数 去除24 留下余数  
加上条件判断


错误,明显不符合现实行规! --------------------编程问答-------------------- 显而易见,任何没有考虑begintime关键点的,都是不符合现实行规的。0:1分入住和23:59分入住,显然结果是不同的。 --------------------编程问答-------------------- #define n 6
temp 为判断的时间,如>14 就= 0.5。 <14 = 0,daydiff 是退房时间-订房时间,月份自己算。
if(beginTime > 6 && beginTime < 18) //此时按照常理来说在当天内都算一天的,可以问客户。
{
if(daydiff > 0)
day = daydiff + temp;
else
day = 1;
}
else if(beginTime >= 18 && beginTime < 24)
{
if(daydiff > 0)
day = daydiff + temp;
else
day = 1;
}
else //在0点到6点之间订房,过14点多算半天天,这是要判断endTime了。
{
day = 1 + dayiff + temp;
}
这是我的思想,伪代码写的。楼主要是觉得合适可以自己转到C# --------------------编程问答-------------------- 伪代码如下:
public double GetTT(datetime begintime, datetime endtime)
{
  double GuestRoomDay=0;
  if(begintime.Hour>=0&&begintime.Hour<=6)//姑且认为begintime的hour关键点是凌晨6点
{
   if(endTime.Hour>=0&&endTime.Hour<14)
   {GuestRoomDay=endTime.AddDays(1).Date.Subtract(startTime.Date);}
   else if(endTime.Hour>=14&&endTime.Hour<18)
   {GuestRoomDay=endTime.AddDays(1).Date.Subtract(startTime.Date)+0.5;}
   else
   {GuestRoomDay=endTime.AddDays(1).Date.Subtract(startTime.Date)+1;}
}

 else
{
   if(endTime.Hour>=0&&endTime.Hour<14)
   {GuestRoomDay=endTime.Date.Subtract(startTime.Date);}
   else if(endTime.Hour>=14&&endTime.Hour<18)
   {GuestRoomDay=endTime.Date.Subtract(startTime.Date)+0.5;}
   else
   {GuestRoomDay=endTime.Date.Subtract(startTime.Date)+1;}

}

 if(GuestRoomDay==0)
{
  GuestRoomDay=1;//如果不足一天(>0&&<24小时)按一天算

}

}



【如果我的回答能够给你一些启示的话,请到下列地址,原创:“金点家庭记账簿2.0”,简单实用,逻辑缜密,考虑周到,欢迎工薪阶层、家庭主妇下载,http://download.csdn.net/source/2247484 你的下载使用并给出宝贵意见只会增加我继续下去的积极性!其实其他我别无所求】
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,