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

时间:2015-07-08 06:47:25

标签: c# .net timespan

我的表格中有两列i-e工作时间和员工出勤的额外时间以及员工必须工作的总时间是九(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;

以上是我的逻辑,我检索到我的正确输出,如果有人有任何问题,请随时通过在此帖子上创建新评论来问我。

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

3 个答案:

答案 0 :(得分:3)

1。 使用TimeSpan.Duration()

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

  

“返回一个新的TimeSpan对象,其值为绝对值   当前的TimeSpan对象“

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"

答案 1 :(得分:3)

首先,在数据库中将时间/持续时间值存储为string是个坏主意。

第二,.Net TimeSpan结构完全能够代表负面持续时间并正确计算。

建议:

  1. 将您的负持续时间存储为数据库中的时间/持续时间值。如果您的数据库没有支持负值的持续时间类型,请添加一个布尔值&#34;此值为负值&#34;

  2. 在您的C#代码中使用TimeSpan和常用的运算符:+-

答案 2 :(得分:1)

这可以满足您的需求吗?

string[] sample = new string[] { "2.1", "-7.0", "1.0" };

TimeSpan total =
    sample
        .Select(s => TimeSpan.FromHours(double.Parse(s)))
        .Aggregate((ts0, ts1) => ts0.Add(ts1));

我得到的total -03:54:00TimeSpan