如何在c#中添加两个带负号的时间跨度值?

我的表中有两列,即员工出勤的工作时间和额外时间以及员工必须工作的总时间是九(9)小时,如果有人在9点钟办理登机手续并且在11点退房,那么系统会自动计算他/她的工作时间和额外时间现在在这种情况下工作时间将是2小时,额外时间将是负数形式,例如-7:00:00小时,因为员工在实际时间前7小时离开并且我将此负值存储为数据库中的“varchar”用于用户协助,以了解员工在给定时间或更短时间内工作得更多.现在我需要添加这些额外时间的员工来创建月份摘要但我不知道如何添加这些负时间跨度和何时我将其转换为timeofday格式,然后由于负号,系统无法转换它.

我从数据库中读取后计算工作小时数:

wrkhrs=wrkhrs.Add(Convert.ToDateTime(dr["WorkHrs"].ToString()).TimeOfDay);

我发现一些减法代码:

TimeSpan exthrs = org_work.Subtract(tot_work);

但如果时间跨度有负号,那么它就不起作用了.
如果有任何机构有任何想法,那么请分享它.提前致谢.

编辑:

public Tuple<string,string>  Calculate_Hours(int id,DateTime strt, DateTime end)
        {
            TimeSpan wrkhrs = new TimeSpan(0, 0, 0);
            TimeSpan exthrs=new TimeSpan(0,0,0);
            //select * from vw_Rept_Attend where UserID ='" + id + "' and convert(date,AtnDate) between '" + strt.Date + "' and '" + end.Date + "'
            cmd = new SqlCommand("sp_Calculate_Hours_For_Report", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@startdate", strt.Date);
            cmd.Parameters.AddWithValue("@end", end.Date);
            conn.Open();
            dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                if (dr["WorkHrs"].ToString().Length>0)
                   wrkhrs=wrkhrs.Add(Convert.ToDateTime(dr["WorkHrs"].ToString()).TimeOfDay);
               if (!dr["ExtraHrs"].ToString().Contains("-") && dr["ExtraHrs"].ToString().Length > 0)
                {
                    exthrs = exthrs.Add(Convert.ToDateTime(dr["ExtraHrs"].ToString()).TimeOfDay);
                }
                else if (dr["ExtraHrs"].ToString().Contains("-") && dr["ExtraHrs"].ToString().Length > 0)
                {
                    string ext = dr["ExtraHrs"].ToString().Substring(dr["ExtraHrs"].ToString().LastIndexOf("-") +1);
                    exthrs = exthrs.Subtract(Convert.ToDateTime(ext).TimeOfDay);
                }
            }
            conn.Close();
            dr.Close();
           return new Tuple<string, string>(string.Format("{0:00}:{1:00}:{2:00}", (int)TimeSpan.Parse(wrkhrs.ToString()).TotalHours, Math.Abs((int)TimeSpan.Parse(wrkhrs.ToString()).Minutes), Math.Abs((int)TimeSpan.Parse(wrkhrs.ToString()).Seconds)), string.Format("{0:00}:{1:00}:{2:00}", (int)TimeSpan.Parse(exthrs.ToString()).TotalHours, Math.Abs((int)TimeSpan.Parse(exthrs.ToString()).Minutes), Math.Abs((int)TimeSpan.Parse(exthrs.ToString()).Seconds)));

        }

并将以上功能称为:

var mytuple = Calculate_Hours(id,Convert.ToDateTime(dtStart.Text), Convert.ToDateTime(dtEnd.Text));
string tot_workHrs= mytuple.Item1;
string tot_ExtHrs=  mytuple.Item2;

以上是我的逻辑,我检索我的正确输出,如果有人有任何问题,请随时通过在这篇文章上创建新评论来问我.

希望现在这对所有人都有帮助….

解决方法:

1.
使用TimeSpan.Duration():

https://msdn.microsoft.com/en-us/library/system.timespan.duration(v=vs.110).aspx

“Returns a new TimeSpan object whose value is the absolute value of
the current TimeSpan object”

2.
或者来自HERE的一些代码:

static string ToHMString(TimeSpan timespan) { 
    if (timespan.Ticks < 0) return "-" + ToHMString(timespan.Negate());

    return timespan.TotalHours.ToString("#0") + ":" + timespan.Minutes.ToString("00");
}

Console.WriteLine(ToHMString(TimeSpan.FromHours(3)));       //Prints "3:00"
Console.WriteLine(ToHMString(TimeSpan.FromHours(-27.75)));  //Prints "-28:45"
上一篇:c# – 为什么TimeSpan.Duration()是方法而不是属性?


下一篇:c# – 当使用group by时,如何在Linq中两个日期时间之间减去Timespan?