需要更正时间跨度字符串格式

Need to correct time span string format

我有一个时间跨度字符串作为

1.21:00:00

这意味着 45 小时,我需要它,因为

45:00:00

我使用以下方法

它完美地解决了上述问题,但是当我将字符串更改为

 1.21:30:00

然后提到代码return我比实际时间多了一个小时。在这种情况下,它 return 我 46:29:00 但我实际需要的是 45:29:00。

我正在使用 C#

编辑

public Tuple<string,string>  Calculate_Hours(DateTime strt, DateTime end)
{
    TimeSpan wrkhrs = new TimeSpan(0, 0, 0);
    TimeSpan exthrs=new TimeSpan(0,0,0);
    cmd = new SqlCommand("select * from vw_Rept_Attend where UserID ='"+Convert.ToInt32 (cmbEmp.SelectedValue)+"' and convert(date,AtnDate) between '"+strt.Date+"' and '"+end.Date+"'",conn);
    conn.Open();
    dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        if (dr["WorkHrs"].ToString().Length>0)
           wrkhrs=wrkhrs.Add(Convert.ToDateTime(dr["WorkHrs"].ToString()).TimeOfDay);
       // exthrs = exthrs.Add(Convert.ToDateTime(dr["ExtraHrs"].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)
        {
            //int index = dr["ExtraHrs"].ToString().LastIndexOf('-');
            //string rhs = dr["ExtraHrs"].ToString().Substring(index + 1);
            string ext = dr["ExtraHrs"].ToString().Substring(dr["ExtraHrs"].ToString().LastIndexOf("-") +1);
            //TimeSpan test = Convert.ToDateTime(dr["ExtraHrs"].ToString()).TimeOfDay.Negate();
            exthrs = exthrs.Subtract(Convert.ToDateTime(ext).TimeOfDay);
        }
    }
    conn.Close();
    dr.Close();
   // string tst = exthrs.ToString().Substring(exthrs.ToString().LastIndexOf("-") + 1);
   // wrkhrs.ToString();
   // exthrs.ToString();
    var val1 = TimeSpan.Parse(wrkhrs.ToString());
   string val3= string.Format("{0}:{1:mm}:{1:ss}", Math.Floor(TimeSpan.Parse(wrkhrs.ToString()).TotalHours), TimeSpan.Parse(wrkhrs.ToString()));
    var val2=TimeSpan.Parse(exthrs.ToString());
    string val4=string.Format("{0}:{1:mm}:{1:ss}", Math.Floor(TimeSpan.Parse(exthrs.ToString()).TotalHours), TimeSpan.Parse(exthrs.ToString()));
    return new Tuple<string, string>(string.Format("{0}:{1:mm}:{1:ss}", Math.Floor(TimeSpan.Parse(wrkhrs.ToString()).TotalHours), TimeSpan.Parse(wrkhrs.ToString())), string.Format("{0}:{1:mm}:{1:ss}", Math.Floor(TimeSpan.Parse(exthrs.ToString()).TotalHours), TimeSpan.Parse(exthrs.ToString())));
   // MessageBox.Show(wrkhrs.ToString()+exthrs.ToString());
}

这就是我所做的。

我不确定我是否明白了,因为你的预期结果很奇怪。您添加了 30 分钟,但期望结果字符串中有 29 分钟?如果我忽略这应该有效:

var ts = TimeSpan.Parse("1.21:30:00");
string result = string.Format("{0:00}:{1:00}:{2:00}", (int)ts.TotalHours, ts.Minutes, ts.Seconds);

Returns: 45:30:00

如果要处理负时间跨度,可以使用 Math.Abs

String.Format("{0:00}:{1:00}:{2:00}", (int)ts.TotalHours, Math.Abs(ts.Minutes), Math.Abs(ts.Seconds));