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

时间:2015-07-09 10:14:58

标签: c# timespan

我有一个时间跨度字符串

1.21:00:00

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

45:00:00

我使用以下方法 Need only HH:MM:SS in time span string

它适用于上述问题,但当我将字符串更改为

 1.21:30:00

然后提到的代码比实际时间多了一个小时。在这种情况下它返回我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());
}

这就是我所做的。

1 个答案:

答案 0 :(得分:0)

我不确定我是否得到它,因为你的预期结果很奇怪。你在结果字符串中添加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);

返回:45:30:00

如果您想处理负时间间隔,可以使用Math.Abs

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