使用不正确的 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)
我计算小时数有误。您在下面看到的值取自数据库,我使用 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)