gpt4 book ai didi

c# - 如何在 C# 中添加两个具有负号的时间跨度值?

转载 作者:太空狗 更新时间:2023-10-30 00:40:04 24 4
gpt4 key购买 nike

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

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

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# - 如何在 C# 中添加两个具有负号的时间跨度值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31285378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com