我需要帮助的人我正在创建一个加班计算,当我试图获得值hrs的值时,当我减去PM到AM和PM到PM时,它变为负数,因为我需要计算当它达到10时的hrs :00 PM继承我的代码
string value = comboBox91.Text;
string value2 = comboBox92.Text;
string awtsu = value;
DateTime dt;
DateTime dt2;
dt = DateTime.Parse(value);
string mystring;
mystring = dt.ToString("hh:mm tt");
dt2 = DateTime.Parse(value2);
string mystring2;
mystring2 = dt2.ToString("hh:mm tt");
double diff2 = (dt2 - dt).TotalHours;
textBox8.Text = Convert.ToString(diff2) + "Hrs";
string pmm = "10:00 PM";
DateTime pm = DateTime.Parse(pmm);
string mystring3;
mystring3 = pm.ToString("hh:mm tt");
if (dt2 > pm)
{
double diff = (dt - dt2).TotalHours;
textBox9.Text = Convert.ToString(diff) + "Hrs";
}
else
{
textBox9.Text = ("0");
}
$
答案 0 :(得分:0)
让我看看我是否理解你的要求:
工作人员在标准时间(上午8:30)开始,通常在标准时间(下午6:30)结束,但可能稍后工作。从理论上讲,这个人可能会在午夜到第二天工作。
如果他们的工作时间是晚上7点到晚上10点,他们可以获得一个加班费。
如果他们的工作时间超过10小时,那么这些小时的费用是第二次。
因此,您在代码中声明的第一件事就是这些加班边界的列表:
public static readonly TimeSpan[] OvertimeBoundaries =
{
TimeSpan.FromHours(19), // 7 PM
TimeSpan.FromHours(22) // 10 PM.
};
TimeSpan是一个表示时间间隔的结构,适合表示每日事件。
接下来,考虑到工人的开始和结束时间,您需要测量每个时间间隔的总小时数:
public static TimeSpan[] GetOvertimeWorked(DateTime startDateTime, DateTime endDateTime, IList<TimeSpan> overtimeBoundaries)
{
var overtimeWorked = new TimeSpan[overtimeBoundaries.Count];
for (int i = 0; i < overtimeBoundaries.Count - 1; i++)
{
var time1 = startDateTime.Date + overtimeBoundaries[i];
var time2 = startDateTime.Date + overtimeBoundaries[i + 1];
if (time1 > time2)
throw new ArgumentException("overtimeBoundaries are not in order");
if (endDateTime > time2)
overtimeWorked[i] = time2 - time1;
else if (endDateTime > time1)
overtimeWorked[i] = endDateTime - time1;
else
overtimeWorked[i] = TimeSpan.Zero;
}
if (overtimeWorked.Length > 0)
{
var timeLast = startDateTime.Date + overtimeBoundaries[overtimeBoundaries.Count - 1];
if (endDateTime > timeLast)
overtimeWorked[overtimeBoundaries.Count - 1] = endDateTime - timeLast;
else
overtimeWorked[overtimeBoundaries.Count - 1] = TimeSpan.Zero;
}
return overtimeWorked;
}
最后,你需要提取适当的日期和时间。来自您的用户界面的时间信息,调用上述实用程序以获得加班时间并显示它。
如果你有意义地命名你的变量而不是像#34; dt2&#34;这样的名字,你的代码会更容易理解。和&#34; awtsu&#34;。您还应该至少将业务逻辑与从用户界面加载和卸载数据的代码分开。
最后,我会注意到以下情况很危险:
string pmm = "10:00 PM";
DateTime pm = DateTime.Parse(pmm);
这里的问题是,如果你传递&#34; DateTime.Parse&#34;一个只有&#34;时间的字符串&#34;组件,它将fill in the date information with the current clock setting on your computer。如果您将应用程序投入生产,这可能会产生随机,难以重现的错误,因为应用程序可能会或可能不会在工作人员工作的不同日期运行!