时间跨度差异计算不正确
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");
我正在用 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");