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

如何在c#中添加两个带负号的时间跨度值?,c#,.net,timespan,C#,.net,Timespan,我的表中有两列,即工作时间和员工出勤的额外时间,员工必须工作的总时间为九(9)小时数如果有人在9点报到,11点退房,那么系统会自动计算他/她的工作时间和现在的加班时间。在这种情况下,工作时间为2小时,加班时间为负数,例如-7:00:00小时,因为员工比实际时间早7小时离开,我将此负值存储为“varchar”在数据库中,为了方便用户理解员工在给定时间内工作的时间是多是少。现在我需要添加这些额外的员工小时数,以创建月份摘要,但我不知道如何添加这些负时间跨度,当我将其转换为天时格式时,由于负号,系统无

我的表中有两列,即工作时间和员工出勤的额外时间,员工必须工作的总时间为九(9)小时数如果有人在9点报到,11点退房,那么系统会自动计算他/她的工作时间和现在的加班时间。在这种情况下,工作时间为2小时,加班时间为负数,例如-7:00:00小时,因为员工比实际时间早7小时离开,我将此负值存储为“varchar”在数据库中,为了方便用户理解员工在给定时间内工作的时间是多是少。现在我需要添加这些额外的员工小时数,以创建月份摘要,但我不知道如何添加这些负时间跨度,当我将其转换为天时格式时,由于负号,系统无法将其转换

我从数据库中读取后,计算工作时间总和为:

wrkhrs=wrkhrs.Add(Convert.ToDateTime(dr["WorkHrs"].ToString()).TimeOfDay);
我发现一些减法的代码如下:

TimeSpan exthrs = org_work.Subtract(tot_work);
但如果timespan有负号,那么它就不起作用。 如果有人有任何想法,请分享。提前谢谢

编辑:

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

希望这对大家都有帮助。 使用
TimeSpan.Duration()

“返回其值为的绝对值的新TimeSpan对象 “当前TimeSpan对象”

二,。 或以下代码:

静态字符串到hmstring(TimeSpan TimeSpan){
if(timespan.Ticks<0)返回“-”+ToHMString(timespan.Negate());
返回timespan.TotalHours.ToString(“#0”)+”:“+timespan.Minutes.ToString(“00”);
}
控制台写入线(ToHMString(TimeSpan.FromHours(3))//打印“3:00”
控制台写入线(ToHMString(TimeSpan.FromHours(-27.75))//印刷品“-28:45”

首先,将时间/持续时间值存储为数据库中的
字符串是个坏主意

其次,
.Net
TimeSpan
结构完全能够表示负持续时间,并使用这些时间进行正确计算

建议:

  • 将负持续时间作为时间/持续时间值存储在数据库中。如果您的数据库没有支持负值的持续时间类型,请添加布尔值“此值为负值”

  • 在C代码中,使用
    TimeSpan
    和常用运算符:
    +
    -


  • 这能满足你的需要吗

    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));
    

    我得到的
    总数是
    -03:54:00
    作为
    时间跨度

    请显示一些代码。我只有添加时间跨度的代码请添加问题。从问题的格式很难理解你在问什么。将其分解成句子会有帮助,最好提供一些代码。您能显示输入和所需的输出吗?我不需要绝对值。有些值可能是负值,那么如何处理负值计算?@Waqas更新的答案,请检查。另外,如果您将其存储为字符串(这一点不推荐)只需使用绝对值,并在其前面加上负号。如果我将其作为时间跨度存储在数据库中,则数据库根本无法接受负时间跨度。我之前尝试过,然后将其保存为字符串。因此,您的问题是如何将负时间存储在数据库中?现在您将其存储为字符串,这应该仍然有效。如果不是,则只需将所有值存储为正数,并在数据表中具有bool属性,该属性告诉您该值是否为+/-.+1,尽管对于某些预定义精度(如分钟、秒或毫秒),持续时间值通常最好存储为整数。对于员工的工作时间,我建议将持续时间(分钟)作为整数。注意:在许多数据库(如SQL Server)中,时间是一天中的时间,而不是经过的时间。
    var mytuple = Calculate_Hours(id,Convert.ToDateTime(dtStart.Text), Convert.ToDateTime(dtEnd.Text));
    string tot_workHrs= mytuple.Item1;
    string tot_ExtHrs=  mytuple.Item2;
    
    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"
    
    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));