仅计算小时和分钟的时间

时间:2018-01-11 00:44:43

标签: c# timespan

我正在尝试创建一个时间表计算器,用于计算员工工作的时间,我很接近,有一个问题。

当我执行计算时,我只想要显示小时和分钟。我能够做到这一点,但这会导致一个问题。如果员工在整整一分钟之前冲出,则该分钟不包括在计算中。

例如,如果一个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");
    }

2 个答案:

答案 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

但是如果你想要准确,你应该创建一个专门用于计算工作人员工作时数的单独课程。然后,您可以在专用类中封装大量业务规则。工作人员有权利和加班费,费用或罚款率 - 如果做得好,这可能会变得复杂。