使用不正确的 C# 计算 24 小时格式的小时总和

Calculation of sum of hours in 24h format with incorrect C#

我计算小时数有误。您在下面看到的值取自数据库,我使用 C# 的任务是计算小时数。

我列出以下问题:

1) 总错误时间,

2) 正如您在数据网格视图中看到的那样,有一个时间是9.7 小时,但一个小时不可能有70 分钟!我把C#代码和相关数据网格视图放在下面,你能帮我解决吗?

DataGridView 值:

24-07-2018  9:7     08:30
25-07-2018  0:0     08:30 
26-07-2018  9:42    08:30

Final sum-> 18:49    1:30

C#代码:

     private void buttonCarica_Click(object sender, EventArgs e)
     {
       dataGridViewPrincipale.Hide();
       dataGridViewSecondario.Hide();
       resetDataGrid();
       string StartDate = dateTimePickerInizio.Value.Date.ToString("dd-MM-yy");
       string EndData = dateTimePickerFine.Value.Date.ToString("dd-MM-yy");
       Utente utemp = new Utente(comboBoxUtenti.Text);
       timemanager tm = new timemanager(utemp);
       PeopleController r = new PeopleController(utemp);
       DataTable dt = tm.CaricaDataeTotaleHour(StartDate, EndData);

       if (dt.Rows.Count == 0)
       {
         reset();
         MessageBox.Show("\n ATTENZIONE:  " + comboBoxUtenti.Text + " in questo range di tempo non ha effettuato marcature");
       }
       else
       {
         labelTotaleHourWork.Show();
         labelTotaleHourWorkMod.Show();
         labelTotaleHourtimemanagerMod.Show();
         labelTotaletimemanager.Show();
         dataGridViewPrincipale.Show();
         TimeSpan tempoSpanTotaleHourWork = TimeSpan.Zero;

         foreach (DataRow dr in dt.Rows)
         {
           String TotaleHourWork = r.CaricaHourGiornaliere(dr["Data"].ToString());
           if (TotaleHour.Equals("0") == false)
           {
             TotaleHourWork = TotaleHourWork.Replace(",", ":");
             tempoSpanTotaleHourWork = SommaHour(TotaleHourWork, tempoSpanTotaleHourWork);
           }

           if (tempoSpanTotaleHourWork == TimeSpan.Zero)
           {
             TotaleHourWork = "0";
           }

           String[] row = { dr["Data"].ToString(), "" + tm.ConteggioHourGiornaliere(dr["Data"].ToString()), "" + TotaleHourWork };
           dataGridViewPrincipale.Rows.Add(row);
         }

         labelTotaleHourtimemanagerMod.Text = "" + tm.GetTotaleHourRange();
         labelTotaleHourWorkMod.Text = "" + CheckValue.ConversioneTimeSpantoString(tempoSpanTotaleHourWork);
         }
       }

private TimeSpan SommaHour(String t1, TimeSpan t2)
{
  t1= TotaleOreCantiere.ToString().Replace(",", ":");
  tempoSpanTotaleOreCantiere = tempoSpanTotaleOreCantiere + TimeSpan.Parse(t2);
  return tempoSpanTotaleOreCantiere;
}

函数 CaricaHourGiornaliere :

public String CaricaHourGiornaliere(String Data)
{
  String ret = "0";
  DataTable dt = RisorseUmaneModel.CaricaHourGiornaliere(Data);

  foreach (DataRow dr in dt.Rows)
  {
    ret = dr["Ore"].ToString();
  }

  return ret;
}

--RisorseUmaneModel--

public static DataTable CaricaHourGiornaliere ( String Data)
{
  String Query = " SET LANGUAGE 'Italian' SELECT CONVERT(VARCHAR(10), People.Data, 105) as DataIns,''+Utente.Nome+' '+Utente.Cognome as Risorsa,DATENAME(WEEKDAY, People.Data) as Giorno,Cliente.RagioneSociale,Working.NomeWorking,convert(varchar(5), Cast(convert(varchar(5), (OreFine - OreInizio), 108) as datetime) - CAST(REPLACE(Pausa, '.', ':') as datetime), 108) as Ore FROM People inner join Working on Working.IdWorking = People.IdWorking inner join Cliente on Working.IdCliente = Cliente.IdCliente inner join Utente on Utente.IdUtente=People.IdUtente  where People.IdUtente = @IdUtente and(People.Data between @Start and @End) order by CONVERT(DateTime, People.Data,101)  asc";
  SqlCommand cmd = new SqlCommand(Query, conn, tran);
  cmd.Parameters.AddWithValue("@IdUtente", SqlDbType.Int).Value = 1;
  cmd.Parameters.AddWithValue("@Start", SqlDbType.DateTime).Value = Data;
  cmd.Parameters.AddWithValue("@End", SqlDbType.DateTime).Value = Data;
  SqlDataAdapter da = new SqlDataAdapter(cmd);
  da.Fill(dt);

  return dt
}

函数CheckValue.ConversioneTimeSpantoString:

public static String ConversioneTimeSpantoString(TimeSpan tm)
{
      return "" + tm.Hours.ToString().Replace("-", "").ToString() + ":" + tm.Minutes.ToString().Replace("-", "").ToString();
}

TotaleHourWork.Replace(",", ":");

“9:7”表示 9 小时 7 分钟。 “9,7”大概意思是9,7小时,也就是9小时42分。

所以不管你怎么想,它都不是。它只会破坏您的大部分数据。

停止替换字符串,获取日期,将其正确解析为 TimeSpans,然后使用这些来计算数字。

在你的函数中public static String ConversioneTimeSpantoString(TimeSpan tm)

改变

tm.Hours //-> the remining hours in this timespan (minus days)

tm.TotalHours //-> the sum of all hours in this timespan (included days, months, years)