2017-10-25 1 views
0

Ich baue ein Webformular in C#. Ich habe 3 Drops downs für Startzeit (Start Stunde, Start Minute und Startzeit des Tages (AM oder PM) und 3 für die Endzeit. Mein Ziel ist es, die Differenz zu berechnen. Alles funktioniert gut, bis Mittag oder Mitternacht wählen ich wähle Mittag und zu debuggen, zeigt der Wert als 1. Hier ist mein Code.Zeitspannenunterschied berechnet nicht richtig

var startHourDDL = ddlStartHour.SelectedValue; 
var startMinuteDDL = ddlStartMinute.SelectedValue; 
var startTOD = ddlStartTOD.SelectedValue; 

int startHour = Convert.ToInt32(startHourDDL); 
int startMinute = Convert.ToInt32(startMinuteDDL); 

var finishHourDDL = ddlFinishHour.SelectedValue; 
var finishMinuteDDL = ddlFinishMinute.SelectedValue; 
var finishTOD = ddlFinishTOD.SelectedValue; 

int finishHour = Convert.ToInt32(finishHourDDL); 
int finishMinute = Convert.ToInt32(finishMinuteDDL); 

if (startTOD == "PM") 
{ 
    startTime = new TimeSpan(startHour + 12, startMinute, 0); 
} 

else 
{ 
    startTime = new TimeSpan(startHour, startMinute, 0); 
} 

if (finishTOD == "PM") 
{ 
    finishTime = new TimeSpan(finishHour + 12, finishMinute, 0); 
} 

else 
{ 
    finishTime = new TimeSpan(finishHour, finishMinute, 0); 
} 

TimeSpan diff = finishTime - startTime; 
string time = String.Format(diff.Hours + " Hours, " + diff.Minutes + " Minutes"); 

lblDurAmount.Text = time; 

wenn ich also 02.00 für Startzeit und 16.00 Uhr für Zielzeit wählen, zeigt das Etikett 2 Stunden. wenn ich jedoch 12.00 für Startzeit und 14.00 Uhr für Zielzeit wählen erhalte ich -10 Stunden.

Dies ist, was ich für Startzeit, wenn ich, um 12:00 Uhr debuggen.

{1.00:00:00} 
Hier

ist das, was ich bekomme, wenn ich wählen 05.00

{17:00:00} 

Ich kann nicht herausfinden, warum es nicht gesetzt Mittag bis 24. Ich habe sogar versucht, das Hinzufügen einer if-Anweisung

if (startHour == 12 && startTOD) 
{ 
    startTime = new TimeSpan(24, startMinute, 0); 
} 

Aber das hat auch nicht funktioniert. Wert war immer noch 1,00.

+2

Warum Sie 'TimeSpan' verwenden Daten zu speichern (zum Beispiel' finishTime')? – mjwills

+1

12PM ohne irgendeinen anderen Kontext kommt nach 2PM, also, wenn Sie 2PM - 12PM subtrahieren, erhalten Sie -10hours. Sie müssen überprüfen, ob startTime nach finishTime ist, und die beiden Werte tauschen, wenn true ist. – Steve

+0

@mjwillis. Kein wirklicher Grund. Ich hatte es mit TimeSpans zu tun, also machte ich alle TimeSpans – maltman

Antwort

1

Eine TimeSpan dient zum Speichern einer Zeitdauer, nicht einer Zeit während des Tages.

Als solche, während Sie glauben, dass Sie "12PM" speichern, was Sie tatsächlich speichern, ist ein 24-Stunden-Zeitraum. Und "2PM" ist ein 14-Stunden-Zeitraum.

Somit "2PM" - "12PM" = 14 Stunden - 24 Stunden (d. H. -10 Stunden).

Um dies zu beheben, müssen Sie Datum/Uhrzeit in DateTime, nicht TimeSpan speichern.

+0

Ah ok. Das macht Sinn. Könntest du es mittags einfach auf 12 und Mitternacht auf 24 setzen? Oder wäre es auf lange Sicht einfacher, die TimeSpans einfach abzulegen? – maltman

+0

Es wäre einfacher, einen Datentyp zu wählen, der das zugrunde liegende Konzept widerspiegelt. 'TimeSpan' dient nicht zum Speichern eines Zeitpunkts (es dient zum Speichern der Dauer). Kannst du es mit 'TimeSpan' anstelle von' DateTime' arbeiten lassen? Sicher. Wird es schwer zu verstehen und zu erhalten sein? Bestimmt. – mjwills

+0

Guter Punkt. Danke für die Hilfe. Ich werde meine Zeitspannen zu Datum Zeit umwandeln und dann Mittag und Mitternacht separat behandeln – maltman

1

Ihre Operationen funktionieren nur, wenn startTime kleiner ist als finishTime, sonst werden alle Ergebnisse als negative zurückgegeben. In Ihrem Beispiel kommt 12 Uhr nach 14 Uhr, wenn Sie also 14 Uhr - 12 Uhr abziehen, erhalten Sie dann - 10 Stunden.
Sie müssen überprüfen, ob Startzeit nach finishTime und tauschen die beiden Werte, wenn wahr

if (finishTime < startTime) 
{ 
    TimeSpan swap = finishTime; 
    finishTime = startTime; 
    startTime = swap; 
} 
TimeSpan diff = finishTime - startTime; 
string time = String.Format(diff.TotalHours + " Hours, " + diff.Minutes + " Minutes"); 
+0

Gleicher Kommentar wie andere Antwort. Würde es funktionieren, nur 2 weitere if-Anweisungen zu setzen und Mittag auf 12 und Mitternacht auf 0 zu setzen? – maltman