我正在尝试创建一个时间表计算器,用于计算员工工作的时间,我很接近,有一个问题。
当我执行计算时,我只想要显示小时和分钟。我能够做到这一点,但这会导致一个问题。如果员工在整整一分钟之前冲出,则该分钟不包括在计算中。
例如,如果一个emp在12:00:30进行冲击并在5:00:29冲出,那么最后一分钟不计算在计算中,所以时间显示为4:59而不是5:00 。
如何根据小时和分钟进行计算并完全排除秒数?
这是我的代码:
private void btnPunchOut_Click(object sender, EventArgs e)
{
DateTime stopTime = DateTime.Now;
lblPunchOutTime.Text = stopTime.ToShortTimeString();
TimeSpan timeWorked = new TimeSpan();
timeWorked = stopTime - startTime;
lblTimeWorked.Text = timeWorked.ToString(@"hh\:mm");
}
答案 0 :(得分:2)
如果你想要一个真正忽略秒数的计算,最明智的方法就是在开始时间和结束时间都去掉秒数。它可能看起来不准确,因为它允许一秒的差异成为一分钟的差异。但这可能仍然是一个有效的业务规则,您希望根据时钟上显示的分钟而不是实际经过的秒数进行减去。
换句话说,
1:00:01调整为1:00:00 1:00:59调整为1:00:00 1:01:00"调整"到1:01:00 1:01:01调整为1:01:00。
你可以用这样的扩展来实现这个目标:
public static class TimespanExtensions
{
public static TimeSpan TrimToMinutes(this TimeSpan input)
{
return TimeSpan.FromMinutes(Math.Truncate(input.TotalMinutes));
}
}
(我确定这是一种更有效的截断秒数的方法,但至少这是明确的。)
现在,您不必弄清楚如何计算差异,同时舍入秒数或增加秒数,您只需在计算差异之前修剪秒数。这是一个单元测试:
[TestMethod]
public void NumberOfMinutesIgnoresSeconds()
{
var startTime = TimeSpan.FromSeconds(59).TrimToMinutes();
var endTime = TimeSpan.FromSeconds(60).TrimToMinutes();
Assert.AreEqual(1, (endTime - startTime).TotalMinutes);
}
一个Timespan
表示59秒,下一个表示60,或下一分钟的第一秒。但如果你修剪秒数然后计算差异,你只需要一分钟。
在您的代码中,
DateTime stopTime = DateTime.Now;
lblPunchOutTime.Text = stopTime.ToShortTimeString();
var timeWorked = stopTime.TrimToMinutes() - startTime.TrimToMinutes();
lblTimeWorked.Text = timeWorked.ToString(@"hh\:mm");
答案 1 :(得分:1)
或许使用TimeSpan.TotalSeconds然后添加30秒或更长时间,然后再将其转换为小时数除以3600。
在
中lblTimeWorked.Text = ((timeWorked.TotalSeconds+30)/3600).ToString("0.00") + " hours";
如果您想要小时,请使用Timespan.TotalHours。
但是如果你想要准确,你应该创建一个专门用于计算工作人员工作时数的单独课程。然后,您可以在专用类中封装大量业务规则。工作人员有权利和加班费,费用或罚款率 - 如果做得好,这可能会变得复杂。