房费如何计算
--------------------编程问答-------------------- 你只说了结束条件,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
你的代码我现在试试,好用联系你~~~~ --------------------编程问答--------------------
/*--------------------编程问答-------------------- To 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;
}
}
}
}
你好,你的代码我试了下,有问题
如 begintime 是 "2010/4/14 22:00:00"
如 endtime 是 "2010/4/15 15:00:00"
仍然返回 1.0
应该返回的是 1.5 --------------------编程问答--------------------
/*--------------------编程问答-------------------- 没过夜咋算啊,比如:10点入住,下午2点又走人! --------------------编程问答-------------------- 还是把开始时间做个详细的分析,在写程序就思路清晰啦! --------------------编程问答--------------------
* 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;
}
}
}
}
9楼的 我是算一天的
实际中也算一天吧 --------------------编程问答-------------------- To LCL_data
感谢你写了这么多,但仍然有问题
如 begintime 是 "2010/4/14 22:00:00"
如 endtime 是 "2010/4/15 12:00:00"
返回 0 了
应该返回的是 1.0 --------------------编程问答--------------------
9楼的代码返回1的 --------------------编程问答-------------------- 今天上午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)--------------------编程问答-------------------- 明明就是基本数学题? --------------------编程问答-------------------- 对了,你想付报酬的话就给青海灾民捐点儿款吧... --------------------编程问答-------------------- 完全同意vrhero老兄的算法
{
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是个有爱心的人,楼主应该按照他说的做 --------------------编程问答--------------------
恩,我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;
}
--------------------编程问答-------------------- 以解决了 --------------------编程问答-------------------- 这个应该是个天加点数的判断..没有楼主想像的那么难吧.?
退房时间减入住时间的天数,加上退房时间点数的判断! --------------------编程问答-------------------- 这个程序难点不在这儿,应该是PC的判断,加上人为的变动操作,才是你这个需求的关键.....
就如程序判断是三天.你感觉打电话通知退房了.结算时间...意思外的情况下..程序怎么统计,这是难做的... --------------------编程问答-------------------- #9L的好想知道你的思路,26L的真的比较简练.... --------------------编程问答-------------------- up...see --------------------编程问答--------------------
代码只是个例子,用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;
}
}
}
}
}
--------------------编程问答-------------------- keyi --------------------编程问答--------------------
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;
}
错了,少算当天上午入住,当天上午退的。
--------------------编程问答--------------------
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;
}
把前面的代码都看看,可以解决问题啦。还没思路的话,怎么跟人家编程啊,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 --------------------编程问答--------------------
(题外话:现在结账时间是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 你的下载使用并给出宝贵意见只会增加我继续下去的积极性!其实其他我别无所求】 --------------------编程问答--------------------
错误,明显不符合现实行规! --------------------编程问答-------------------- 显而易见,任何没有考虑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#