C# WPF酒店入住退房天数计算函数结果不符问题排查
问题:酒店12点退房政策下入住天数计算错误
我在C# WPF窗体中编写了计算酒店入住天数的函数,酒店执行中午12点退房政策,但函数计算出的天数比预期值少。数据库中存储的checkin_date格式为2024-08-26 05:04:06.000,退房日期为当前日期,预期输出应为Days Charged: 3。
原函数代码如下:
public void GetDays() { status = false; // Checkin DATE =2024-08-26 05:04:06.000 AM // checkout DATE =2024-08-27 15:04:06.000 PM DateTime check_inDate = Convert.ToDateTime(dtp_checkin.Text); DateTime check_outDate = DateTime.Now; TimeSpan ts = check_outDate - check_inDate; double NrOfDays = ts.TotalDays; double days = Math.Ceiling(NrOfDays); bool TwelveHourClockEnabled = cd.Check12hourclock(); if (ts.TotalDays >= 0) { int timenow = DateTime.Now.Hour; if (TwelveHourClockEnabled) { if (check_inDate.TimeOfDay.Hours < 12 && check_outDate.TimeOfDay.Hours < 12) { lbl_days.Text = Math.Floor(ts.TotalDays).ToString(); } else if (check_inDate.TimeOfDay.Hours >= 12 && check_outDate.TimeOfDay.Hours >= 12) { lbl_days.Text = Math.Floor(ts.TotalDays).ToString(); } else { lbl_days.Text = Math.Ceiling(ts.TotalDays).ToString(); } } else { // For 24-hour clock, always use ceiling lbl_days.Text = days.ToString(); } Console.WriteLine($"Days Charged: {lbl_days.Text}"); } }
问题分析
原函数的逻辑完全不符合酒店中午12点退房的规则:
- 错误地通过比较入住和退房时间的小时是否在同一时段(上午/下午)来决定用
Math.Floor还是Math.Ceiling,这和12点退房的核心规则无关; - 24小时制下直接用
Math.Ceiling计算总天数,也忽略了12点的分界点,导致天数计算偏差。
修复方案
根据中午12点退房政策,正确的计算逻辑应该是:
- 计算入住日期到退房日期的自然天数差(仅日期部分的差值);
- 如果退房时间晚于当日12:00,则额外加1天;
- 若入住和退房为同一天,且退房时间晚于12:00,按1天计算(符合常规酒店收费规则)。
修改后的代码如下:
public void GetDays() { status = false; DateTime check_inDate = Convert.ToDateTime(dtp_checkin.Text); DateTime check_outDate = DateTime.Now; // 计算日期部分的差值(自然天数) int dateDiff = (check_outDate.Date - check_inDate.Date).Days; int chargedDays = dateDiff; // 判断退房时间是否超过当日12点 if (check_outDate.TimeOfDay > TimeSpan.FromHours(12)) { // 如果退房在12点后,且不是当天入住当天退房的情况,加1天;当天入住当天12点后退房,也按1天算 chargedDays = dateDiff == 0 ? 1 : dateDiff + 1; } // 特殊情况:当天入住当天12点前退房,按0天还是1天?根据酒店规则调整,这里默认按0天,若需按1天则修改为chargedDays = 1 else if (dateDiff == 0) { chargedDays = 0; } lbl_days.Text = chargedDays.ToString(); Console.WriteLine($"Days Charged: {lbl_days.Text}"); }
逻辑验证
以用户给出的预期场景为例:
- 入住日期:
2024-08-26 05:04:06 - 退房日期:
2024-08-28 15:04:06(符合预期输出3天的场景)- 日期差值:28-26=2天
- 退房时间15:04>12:00,加1天,总天数=2+1=3天,符合预期。
内容的提问来源于stack exchange,提问作者user45612
相关产品推荐
相关产品推荐

