Timespan / Differenz zwischen 2 Datumsangaben
-
Ich stosse mit DateTimePicker und TimeSpan auf ein unerwartetes Problem.
private void button1_Click(object sender, EventArgs e) { DateTime date1 = new DateTime(); // Format = Short DateTime date2 = new DateTime(); // Format = Short TimeSpan ts = new TimeSpan(); int days; date1 = dateTimePicker1.Value; // in Form1_Load auf aktuelles Datum gesetzt date2 = dateTimePicker2.Value; // in Form1_Load auf aktuelles Datum gesetzt label1.Text = date1.ToShortDateString(); // immer ok label2.Text = date2.ToShortDateString(); // immer ok ts = date2 - date1; days = ts.Days; // ? label3.Text = days.ToString(); // nur ok, wenn beide oder kein DateTimePicker geändert // nicht ok, wenn nur DateTimePicker2 geändert // dann 1 Tag weniger! }
TimeSpan liefert nur korrekte Werte, wenn entweder keine oder beide Datumsangaben in den DateTimePicker geändert werden.
Wird nur das 2. Datum geändert, liefert TimeSpan 1 Tag weniger oder bei aufeinander folgenden Tagen 0. Wo liegt der Bock?
Die beiden DateTimePicker sind ohne weitere Ereignis-Methoden eingerichtet und liefern richtige Werte date1 und date2.
-
Schuß ins Blaue ohne zu testen: In einem DateTime-Objekt steckt auch die Uhrzeit und Deine Methode die Tagesdifferenz zu berechnen ist alles andere als robust. Es kann leicht vorkommen, dass die Picker zwei aufeinanderfolgende Tage anzeigen, die Differenz aber nur 0 Tage 23 Stunden u.s.w. beträgt.
Im Picker wählt man nur das Datum aus, als Uhrzeit wird irgendwas Beknacktes zurückgegeben, ich glaube die gleiche Uhrzeit zu der das Picker-Objekt erstellt wurde (lol).Btw. *kopfschüttel* bei sowas:
berniebutt schrieb:
TimeSpan ts = new TimeSpan(); ts = date2 - date1;
Warum new TimeSpan()?
-
Ich weiß nicht genau was du vor hast, aber ich denke du suchst eher ts.TotalDays. Ansonsten bekommst du nämlich Probleme wenn jemand ein Datum auswählt was ein Jahr und einen Tag in der Zukunft liegt. Dann liefert ts.Days nämlich 1, statt 366.
-
Danke KPC
Ich will ganze Tage als Zeitspanne haben unabhängig von der Uhrzeit.
ts.TotalDays liefert als double zuverlässige Werte. Man muss beim cast auf int nur einen bei double üblichen Toleranzwert eps = 0.0001
berücksichtigen, auch bei Format = Short für die DatetimePicker. ts.Days erscheint mir somit wertlos.
-
Du kannst auch Google nutzen.
Suche nach c# alter ermitteln
-
Du hast aber schon verstanden was µ geschrieben hat, oder?
Du musst deine beiden
DateTimePicker
mitDateTime.Now.Date
initialisieren, und nicht mitDateTime.Now
.