You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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点退房政策,正确的计算逻辑应该是:

  1. 计算入住日期到退房日期的自然天数差(仅日期部分的差值);
  2. 如果退房时间晚于当日12:00,则额外加1天;
  3. 若入住和退房为同一天,且退房时间晚于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:42:26