我有个问题。我需要用代码总结在办公室工作的时间。我从SQL Server获得的日期没问题,但是我有不同的格式。例如: 2019. 09. 23. 14 : 54 : 23,2019.09.23 14:54:23 或 2019-09-23 14:54:23 ; 我想总结得出的工作时间。不管一年。这是示例:
try { string betölt = "SELECT * from munkaorak where"; if (cbTech.Text != "") { betölt += " Munkaszam='" + cbMunka.Text + "' AND Részfolyamat='" + cbRész.Text + "' AND TechKod='" + cbTech.Text + "'"; } else if (cbRész.Text != "") { betölt += " Munkaszam='" + cbMunka.Text + "' AND Részfolyamat='" + cbRész.Text + "'"; } else if(cbMunka.Text !="") { betölt += " Munkaszam='" + cbMunka.Text + "'"; } betölt += " order by ID DESC"; MySqlCommand name = new MySqlCommand(betölt, kapcsolat); kapcsolat.Open(); olvasó = name.ExecuteReader(); int összora = 0; if (olvasó.HasRows) { while (olvasó.Read()) { if (olvasó.GetString(7) != "Befejezés: ") { string[] aha = olvasó.GetString(6).Split(' '); string kezdes = aha[4]; string[] kezd = kezdes.Split(':'); int kezdoido = Convert.ToInt32(kezd[0]) * 60 * 60 + Convert.ToInt32(kezd[1]) * 60 + Convert.ToInt32(kezd[2]); int befejezoido = 0; string aha22 = ""; if (olvasó.GetString(7).IndexOf('-') >= 0) { string[] aha2 = olvasó.GetString(7).Split(' '); string befejezes = aha2[1]; string[] bef = befejezes.Split(':'); aha22 = aha2[0].Split('-')[2]; befejezoido = Convert.ToInt32(bef[0]) * 60 * 60 + Convert.ToInt32(bef[1]) * 60 + Convert.ToInt32(bef[2]); } else { string[] aha2 = olvasó.GetString(7).Split(' '); string befejezes = aha2[4]; string[] bef = befejezes.Split(':'); aha22 = aha2[3]; befejezoido = Convert.ToInt32(bef[0]) * 60 * 60 + Convert.ToInt32(bef[1]) * 60 + Convert.ToInt32(bef[2]); } string dolgozott = ""; if (aha[3].Replace(".", "") == aha22.Replace(".", "")) { dolgozott = mpbolora(befejezoido - kezdoido); összora += befejezoido - kezdoido; } else { dolgozott = mpbolora((86400 - kezdoido) + befejezoido); összora += (86400 - kezdoido) + befejezoido; } string validalo = ""; try { string[] validal = olvasó.GetString(9).Split(' '); validalo = validal[0] + " " + validal[1] + " " + validal[2] + validal[3] + validal[4] + " " + validal[5]; } catch { validalo = olvasó.GetString(9); } string munkafolyamat = olvasó.GetString(3) + "-" + olvasó.GetString(4) + "-" + olvasó.GetString(5); string[] sorok = { olvasó.GetString(2), dolgozott, olvasó.GetString(6).Replace("Kezdés: ", ""), olvasó.GetString(7).Replace("Befejezés: ", ""), olvasó.GetString(8), validalo, munkafolyamat }; var lv = new ListViewItem(sorok); lvStat.Items.Add(lv); } } } else { kapcsolat.Close(); MessageBox.Show("Nincs adat!", "Figyelem"); } kapcsolat.Close(); lblÖssz.Text = "Összesen ledolgozott órák: " + mpbolora(összora); } catch (Exception a) { MessageBox.Show(a.Message); kapcsolat.Close(); } kapcsolat.Close();
它可以正常工作,但是当出现不同格式时,由于-或空格而无法正常工作。请帮忙!
在中C#,提供了许多方法将包含多种格式的日期时间的字符串转换为统一DateTime对象。这些方法可以识别很多标准日期时间格式,如果您与它们不同,您甚至可以提供自己的格式。
C#
DateTime
DateTime.Parse()
DateTime.TryParse()
true``false
DateTime.TryParseExact()
true
false
在您的情况下,您可以这样使用DateTime.TryParse()(DateTime.Parse()除非您绝对确定格式正确,否则建议使用简单的做法,而不是简单地使用它):
var dtStr1 = " 2019. 09. 23. 14:54:23"; var dtStr2 = "2019.09.23 14:54:23"; var dtStr3 = "2019-09-23 14:54:23"; DateTime.TryParse(dtStr1, out DateTime dt1); DateTime.TryParse(dtStr2, out DateTime dt2); DateTime.TryParse(dtStr3, out DateTime dt3);
一旦转换为DateTime对象,它就不再具有与之关联的格式。这是个structure,因此只有成员变量和方法。因此,要计算总时数等,可以使用提供的方法。
structure
假设您要计算一天工作开始到结束之间的时间。您可以将它们转换为DateTime对象,然后从其他对象中减去一个对象,这将为您提供一个TimeSpam对象。
TimeSpam
var dtStrStart = "2019.09.23 08:23:12"; var dtStrEnd = "2019.09.23 16:17:28"; DateTime.TryParse(dtStrStart, out DateTime dtStart); DateTime.TryParse(dtStrEnd, out DateTime dtEnd); var diff = dtEnd - dtStart;
现在TimeSpan,diff此处的对象将为您提供一堆具有小时,分钟等差异的属性。
TimeSpan
diff
的TimeSpan.Days,TimeSpan.Minutes等会给你在天,分钟等时间
TimeSpan.Days
TimeSpan.Minutes
Console.WriteLine(diff.Days); Console.WriteLine(diff.Hours); Console.WriteLine(diff.Minutes); Console.WriteLine(diff.Seconds); Console.WriteLine(diff.Milliseconds);
输出:
0 7 54 16 0
0
7
54
16
在TimeSpan.TotalMinutes等会给你在各个单元的整个时间段。
TimeSpan.TotalMinutes
Console.WriteLine(diff.TotalDays); Console.WriteLine(diff.TotalHours); Console.WriteLine(diff.TotalMinutes); Console.WriteLine(diff.TotalSeconds); Console.WriteLine(diff.TotalMilliseconds);
0.329351851851852 7.90444444444444 474.266666666667 28456 28456000
0.329351851851852
7.90444444444444
474.266666666667
28456
28456000
相反,当您在数据库中存储数据时,必须再次使用标准格式,例如datetime或datetime2。
datetime
datetime2