我有一个时间跨度字符串
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());
}
这就是我所做的。
答案 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));