时间跨度差异计算不正确

Timespan difference not calculating correctly

我正在用 C# 构建 Web 表单。我有 3 个开始时间下拉列表(开始时间、开始分钟和一天中的开始时间(上午或下午)和 3 个结束时间。我的目标是计算差异。一切正常,直到我选择中午或午夜。当我选择中午调试,值显示为1。这是我的代码。

var startHourDDL = ddlStartHour.SelectedValue;
var startMinuteDDL = ddlStartMinute.SelectedValue;
var startTOD = ddlStartTOD.SelectedValue;

int startHour = Convert.ToInt32(startHourDDL);
int startMinute = Convert.ToInt32(startMinuteDDL);

var finishHourDDL = ddlFinishHour.SelectedValue;
var finishMinuteDDL = ddlFinishMinute.SelectedValue;
var finishTOD = ddlFinishTOD.SelectedValue;

int finishHour = Convert.ToInt32(finishHourDDL);
int finishMinute = Convert.ToInt32(finishMinuteDDL);

if (startTOD == "PM")
{
    startTime = new TimeSpan(startHour + 12, startMinute, 0);
}

else
{
    startTime = new TimeSpan(startHour, startMinute, 0);
}

if (finishTOD == "PM")
{
    finishTime = new TimeSpan(finishHour + 12, finishMinute, 0);
}

else
{
    finishTime = new TimeSpan(finishHour, finishMinute, 0);
}

TimeSpan diff = finishTime - startTime;
string time = String.Format(diff.Hours + " Hours, " + diff.Minutes + " Minutes");

lblDurAmount.Text = time;

因此,如果我选择 2:00 下午作为开始时间,4:00 下午作为结束时间,标签会显示 2 小时。但是,如果我选择 12:00 PM 作为开始时间,选择 2:00 PM 作为结束时间,我得到 -10 小时。

这是我在下午 12:00 调试时得到的开始时间。

{1.00:00:00}

这是我选择 5:00 PM

时得到的结果
{17:00:00}

我不明白为什么它不会将中午设置为 24。我什至尝试添加一个 if 语句

if (startHour == 12 && startTOD)
{
    startTime = new TimeSpan(24, startMinute, 0);
}

但这也没有用。值仍然是 1.00。

A TimeSpan 用于存储持续时间,而不是一天中的时间。

因此,虽然您认为自己存储的是“12PM”,但实际上存储的是 24 小时时间段。而“下午 2 点”是一个 14 小时的时间段。

因此“2PM”-“12PM”= 14 小时 - 24 小时(即 -10 小时)。

要解决此问题,您需要将 date/time 存储在 DateTime 中,而不是 TimeSpan

只有当 startTime 小于 finishTime 时,您的操作才有效,否则所有结果都将返回负数。在您的示例中,下午 2 点之后是 12 点,因此当您减去 2 点 - 12 点时,您得到 -10 小时。
您需要检查 startTime 是否在 finishTime 之后,如果为 true

则交换这两个值
if (finishTime < startTime)
{
    TimeSpan swap = finishTime;
    finishTime = startTime;
    startTime = swap;
}
TimeSpan diff = finishTime - startTime;
string time = String.Format(diff.TotalHours + " Hours, " + diff.Minutes + " Minutes");