Laden...

Zeitdifferenz Berechnung

Letzter Beitrag vor 19 Jahren 46 Posts 13.218 Views
Zeitdifferenz Berechnung

Hallo,

also ich habe ein grosses problem. Ich sitze schon seit tagen dran.
Also ich möchte ein Zeit berechnen zwischen 21:00 bis nächsten tag 04:00. In meiner Access Datenbank ist mein 1. Feld: anfangszeit, Feldtyp: Datum/Uhrzeit, Feldgrösse: Zeit, 24STunden. 2. Feld ist das gleiche. So

Bsp : 29.03.2006, 22:00 bis nachts 04:00 also ist ja das datum 30.03.2006.
Also wie kann ich das jetzt programmier technisch in C# lösen.

Meine TextBox namen in c# sind : txtanfangszeit, txtendzeit. und txt stunden(um die Stunden anzuzeigen)

Also viel dank voraus

Schau mal in der MSDN nach System.DateTime und vor allem nach TimeSpan.

Du kannst zwei DateTime-s voneinander abziehen (mit dt1.subtract(dt2)) und kriegst eine TimeSpan zurück. Das funktioniert auch "Datum-übergreifend".

Also ich habe da schon geguckt. Aber komme überhaupt nicht klar. Was da steht. Bin noch anfänger.

Mein source code ist so

private void txt_2_endzeit_Leave(object sender, System.EventArgs e)
{
DateTime d1=Convert.ToDateTime(this.txt_2_anfangszeit.Text);
DateTime d2=Convert.ToDateTime(this.txt_2_endzeit.Text);
TimeSpan ts=new TimeSpan(d1.Ticks - d2.Ticks);

this.txtstunden.Text= ts.TotalHours("0.0");

}

Naja, Du holst Dir doch die Werte aus der Datenbank. Wie speicherst Du die denn in Deinem C#-Code ?

ah, Du warst schneller.


private void txt_2_endzeit_Leave(object sender, System.EventArgs e)
{
DateTime d1=Convert.ToDateTime(this.txt_2_anfangszeit.Text);
DateTime d2=Convert.ToDateTime(this.txt_2_endzeit.Text);
TimeSpan ts= d2.subtract(d1);


this.txtstunden.Text= ts.TotalHours("0.0");


}

Versuchs mal so.

so speicher ich es

con.Open();
String diskothek = this.cbdiskothek.SelectedItem.ToString();
string sql="SELECT tab_auftrag_diskothek2.[aufd2-lfd-nr], tab_auftrag_diskothek2.[aufd2-p-nr], tab_personal.[p-name], tab_personal.[p-tel], tab_personal.[p-mobile], tab_auftrag_diskothek2.[aufd2-equipment], tab_auftrag_diskothek2.[aufd2-stundensatz], tab_personal.[p-position] FROM tab_personal INNER JOIN tab_auftrag_diskothek2 ON tab_personal.[p-nr] = tab_auftrag_diskothek2.[aufd2-p-nr] WHERE tab_personal.[p-name] ='"+this.cb_pname.SelectedItem+"'";

cmd = new OleDbCommand(sql, con);
dr=cmd.ExecuteReader();
dr.Read();

this.txt_2_personalnr.Text = dr["aufd2-p-nr"].ToString();
this.txt_2_equipment.Text = dr["aufd2-equipment"].ToString();
this.txt_2_stundensatz.Text = dr["aufd2-stundensatz"].ToString();
this.txt_2_anfangszeit.Text = dr["aufd2-anfangszeit"].ToString();
this.txt_2_endzeit.Text = dr["aufd2-endzeit"].ToString();
this.txt_2_position.Text = dr["p-position"].ToString();
this.txt_2_tel.Text = dr["p-tel"].ToString();
this.txt_2_mobile.Text = dr["p-mobile"].ToString();
this.txtstunden.Text=dr["aufd2-stunden"].ToString();
dr.Close();
con.Close();

er meckert rum..........

System.TimeSpan.TotalHours' deutet auf 'Eigenschaft' hin, wo 'Methode' erwartet wurde

Moment ...
Ach so, ja ... laß das ("0.0") weg. Sonst interpretiert er das als Methodenaufruf.
Du kriegst ja dann ein Double zurück. Das kannst Du mit ToString() in einen String umwandeln und auch entsprechend formatieren.

Also :

 blablah.Text = ts.TotalHours.ToString();

ja habe es schon auch gemacht aber meckert rum da Double zu String nicht möglich ist.

Also ich habe das hinbekommen aber leider ist der Ergebnis falsch.
statt das es 6 stunde herauszubekommen von 22:00(abends) bis 04:00(nachts aber ist ja nächste Tag) bekommen ich -18 heraus!!!
Bis dahin bin ich auch gekommen.
Leider weiss ich nicht mehr weiter.

MUSS DA NICHT AUF DIE TAG/E berücksichtigt werden????

Poste mal den geänderten Code, bitte.
Ah, negatives Ergebnis. Dann versuchs mal damit, d1 und d2 zu vertauschen.
Also statt

d2.Subtract(d1);

machst Du

d1.Subtract(d2);

Hallo cimbomlu2,

hast du dich mit r-guner abgesprochen? => Zeitdifferenz zweiter Uhrzeiten

herbivore

Wir gehen in das gleiche Seminar, die aufgabenstellung ist an die gesamte klasse gerichtet. Vielleicht daher die gleichen fragen.

Ach so. Dann solltet ihr beiden euch evtl auf einen Thread einigen. Doppelte Themen sind ja nicht so prickelnd. Hat es geklappt inzwischen ?

Mein geänderter Code..

DateTime d1=Convert.ToDateTime(this.txt_2_anfangszeit.Text);
DateTime d2=Convert.ToDateTime(this.txt_2_endzeit.Text);
TimeSpan ts= d1.Subtract(d2);

this.txtstunden.Text= ts.TotalHours.ToString();

ABER MUSST DA NICHT AUF TAG BERÜCKSICHTIGT WERDEN

Original von cimbomlu2
Mein geänderter Code..

DateTime d1=Convert.ToDateTime(this.txt_2_anfangszeit.Text);
DateTime d2=Convert.ToDateTime(this.txt_2_endzeit.Text);
TimeSpan ts= d1.Subtract(d2);

this.txtstunden.Text= ts.TotalHours.ToString();

ABER MUSST DA NICHT AUF TAG BERÜCKSICHTIGT WERDEN

ALSO ES KOMMT IMMER NOCH DER GLEICHE BETRAG HERAUS 18 kein unterschied.

Original von cimbomlu2
ABER MUSST DA NICHT AUF TAG BERÜCKSICHTIGT WERDEN

Wie meinst Du das ?
Wenn es über die Tagesgrenze rausgeht , dann berücksichtigt das DateTime normalerweise automatisch. Also war bei mir bisher so ...

Und noch ein Tipp: Code - Tags verwenden ...

Kann es vielleicht an Datenbank liegen. da meine beide felder wie ich da schon beschrieben habe in datum/uhrzeit , Zeit, 24Std ist.

Eigentlich nicht. Wenn es mal in DateTime umgewandelt ist, dann spielt der DB-Wert keine Rolle mehr. Hast Du mal überprüft, ob die Werte richtig umgewandelt werden ?
Also, daß 22 Uhr auch 22Uhr ist und nicht 10 ?

Mit Access-DB kann ich mich nicht so aus. Ich verwende meistens DataSet. Aus meiner PHP-Zeit bin ich noch MySQL - geschädigt und habe eine natürliche Aversion gegen M$-DBs.

also naja ich habe die so umgewandelt in verschiedenen methoden

erste methode bei wechseln bei einer ComboBox:

this.txt_2_anfangszeit.Text = dr["aufd2-anfangszeit"].ToString(); this.txt_2_endzeit.Text = dr["aufd2-endzeit"].ToString();


2 Methode: this.txt_2_anfangszeit.Text = "00:00"; this.txt_2_endzeit.Text = "00:00";

UND BEI MEINER SQL BEFEHL MACH ICH ES SO JETZT AUCH ANDERE METHODE UM EINZUFÜGEN:

string sql ="INSERT INTO tab_auftrag_diskothek2 ([aufd2-lfd-nr], [aufd2-p-nr],[aufd2-equipment],";
sql = sql + "[aufd2-stundensatz], [aufd2-anfangszeit], [aufd2-endzeit]) values (";
sql = sql + System.Convert.ToInt32(this.txtaufdlfdnr.Text)+",";
sql = sql + System.Convert.ToInt32(this.txt_2_personalnr.Text)+",'";
sql = sql + this.txt_2_equipment.Text+"', '";
sql = sql + this.txt_2_stundensatz.Text+"', '";
sql = sql + this.txt_2_anfangszeit.Text+"','";
sql = sql + this.txt_2_endzeit.Text+"')";

Was steht denn in

this.txt_2_anfangszeit.Text

, wenn es durch die DB gefüllt wurde ?

Geben wir z.B. 04:00 ein bei C# formular, steht in der Access DB 30.12.1899 04:00:00.

Aber vorher ist dieser Feld leer. weil wir ja nocht nichts eingeben.Erst nach der eingaben steht in Acces was

30.12.1899 ??? Das richtige Datum sollte schon auch mit rein, damit die Berechnung richtig funktioniert.
Was steht denn bei 22 Uhr drin? Das wäre interessanter ...

Daß noch nix in der DB steht, wenn man noch nichts eingegeben hat, ist klar.

Ich habe jetzt in C#:

txtanfangszeit: 22:00 Uhr eingegeben, nach dem verlassen des Feldes hat er die Zeit in 30.03.2006 22:00 formatiert.

In txtendzeit habe ich: 04:00 eingeben, dieses Feld wurde in 30.03.2006 04:00 formatiert.
In der Datenbank selbst stehen die Zeiten:

Anfangszeit Endzeit
22:00 04:00

Ich würde mal behaupten wollen, daß Du das genaue Datum mitübergeben mußt, wenn das gescheit funktionieren soll. Also Eingaben: 30.3.06 22:00 - bis - 31.03.06 04:00 Uhr
Das komplett in die DB übernehmen, nicht nur die Uhrzeiten. Dann beim Rücktransformieren aus den DB - Daten in DateTime das Datum auch mitberücksichtigen.
Kann nicht behaupten, daß es dann sofort funktioniert. Aber es funktioniert schon auf jeden fall besser.

Wenn er nämlcih keinen bestimmten Tag bekommt, dann wird der "Standard-Tag" genommen. Also kriegst Du den Zeitraum zwischen 4 und 22 Uhr des selben Tages. Das sind nunmal 18 Stunden ...

Weiß nicht, ob du mittlerweile den Tag berücksichtigst, aber laut deinem folgendem Code von der 2. Seite:


DateTime d1=Convert.ToDateTime(this.txt_2_anfangszeit.Text);
DateTime d2=Convert.ToDateTime(this.txt_2_endzeit.Text);
TimeSpan ts= d1.Subtract(d2);

subtrahierst du falsch:

anfangszeit - endzeit (also 30. 22:00 - 31. 04:00) gibt natürlich -18 h!

Du musst endzeit - anfangszeit rechnent (also 31. 04:00 - 30. 22:00), dann solltest du auch 6 h rausbekommen (hat herbivore übrigens zuvor auch schon vorgeschlagen)...

Übrigens musst du nicht unbedingt die Subtract-Funktion benutzen. Funktioniert auch folgendermaßen:

TimeSpan ts = d2 - d1;

Original von suamikim
Übrigens musst du nicht unbedingt die Subtract-Funktion benutzen. Funktioniert auch folgendermaßen:

TimeSpan ts = d2 - d1;  

War das in .net 1.1 auch schon so ?

Hallo Fil,

War das in .net 1.1 auch schon so ?

ja!

herbivore

Meine mich dunkel erinnern zu können, daß ich mit der Methode (also "-" statt "Subtract") mal Probleme hatte. Weiß jetzt aber nicht mehr, in welchem Zusammenhang und was das genau war. Gibt es denn bestimmte Voraussetzungen, damit das so funktioniert ?

Ich danke dir vielmals, ich habe es hinbekommen. Es wird nun die Zeit richtig berechnet. Ich würde aber gerne noch wissen, ob es möglich ist, eine automatische Formatierung hinzubekommen.
Also, wenn ich in Anfangszeit etwas eingebe und in endzeit, dass das Datum automatisch sich ein tag vorsetzt.

Eingabe: 22:00 Uhr, beim Verlassen setzt er den Wert auf 30.03.2006 22:00 Uhr
Bei Endzeit: 04:00 Uhr, beim Verlassen 30.03.2006 04:00, aber er soll den Tag automatisch auf 31.03.2006 04:00 Uhr formatieren.

Du könntest mit einem EventHandler ans Validating-Event und dort sicherstellen, daß das End-Datum nach dem Anfangs-Datum ist. Sprich also, wenn die Uhrzeit "früher" ist, dann muß es der Tag danach sein.

Hallo Fil,

Gibt es denn bestimmte Voraussetzungen, damit das so funktioniert ?

wüsste ich nicht. Ob man DateTimes oder Ints voneinander abzieht, sollte keinen Unterschied machen.

herbivore

könntest du mir ein Beispiel schreiben als source code, da ich noch nie mit EVENTHANDLER und VALIDITING gearbeitet habe.

Hallo cimbomlu2,

hast du denn schon mal nach z.B. Validating im Forum gesucht?

herbivore

Herr moderator leider nicht gucke jetzt danke für den Tip. Sorry bin neu hier in forum. Kenne mich net gut aus.

Am besten erstmal ein Buch über C# lesen und rausfinden was Events sind und wie man sie benutzt. Ohne dieses Wissen, würde ich die Finger von Windows Programmierung lassen. Dann vielleicht nochmal in einem gesonderten Tutorial eine Einführung in WinForms-Programmierung.

Danke für den Tip, das weiss doch jedes kind. Dass man erst gucken soll im Buch.Hab ich auch schon geguckt. Wollte nur ein Bespiel haben wie es aussehen könnte aber egal.

DANKE FÜR ALLE DIE MIR GEHOLFEN HABEN BESONDERS FIL

Hallo cimbomlu2,

machmal bekommt man nicht die Hilfe, die man sich wünscht. Aber manchmal ist die Hilfe, die man bekommt, besser als die, die man sich wünscht.

herbivore

Original von herbivore
Hallo Fil,

Gibt es denn bestimmte Voraussetzungen, damit das so funktioniert ?
wüsste ich nicht. Ob man DateTimes oder Ints voneinander abzieht, sollte keinen Unterschied machen.

herbivore

Ich glaub, ich weiß es wieder. Damals wollte ich glaub ich eine TimeSpan von einer DateTime abziehen ... so oder so ähnlich.

@cimbomlu2:
Wir wollen Dich ja nicht dem Vorwurf aussetzen, Du hättest Deine gesamte Lösung aus dem Internet 😁
Ich denke auch mal, daß es ausreicht, wenn der User darauf selber achtet. Wenn ihr das Thema "Events" - und deren "Handler" in eurem Seminar noch nicht behandelt habt, Dann geh ich mal davon aus, daß sowas nicht verlangt wird. Wenn doch hätte der Dozent ruhig mal einen Tipp geben können.

JA HERR MODERATOR, dass SAGE ICH ES AUCH IMMER.

Hallo cimbomlu2,

gut, dann komme ich mal gleich meinen Moderationspflichen nach und weise dich darauf hin, dass SCHREIEN hier nicht erwünscht ist. Ich bitte dich, das zu respektieren. Vielen Dank!

herbivore

Hallo Fil,

man kann von einer TimeSpan kein DateTime abziehen. Anderesherum geht es.

herbivore

Ich glaub, das ist keine Absicht von ihm. Er ist wohl noch nciht so bewandert in Foren und der hiesigen Netiquette ...

@cimbomlu2:
Zur Info : GROSS - Schreibung heißt in Foren so viel wie "schreien". Das ist nicht gerne gesehen. - Wer wird schon gerne angeschrien ?
Wenn Du etwas betonen möchtest, gibt es die Möglichkeiten, fett zu schreiben oder kursiv oder unterstrichen.

Hallo Fil,
man kann von einer TimeSpan kein DateTime abziehen. Anderesherum geht es.
herbivore

Oh, so herum meinte ich es auch. Es geht also auch DateTimeInstanz - TimeSpanInstanz ? Bin mir jetzt fast sicher, daß er damals deswegen gemeckert hatte.

Hallo Fil,

Es geht also auch DateTimeInstanz - TimeSpanInstanz ?

ja, das geht. Das Ergebnis ist allerdings ein DateTime und keine TimeSpan.

herbivore

Hi Fil

Das funktioniert auch mit dem - Operator! Ist eigentlich auch logishc, dass man einem Datum eine Zeitspanne abziehen kann, jedoch einer Zeitspanne kein Datum!

Gruss,
.unreal

Original von .unreal
Hi Fil

Das funktioniert auch mit dem - Operator! Ist eigentlich auch logishc, dass man einem Datum eine Zeitspanne abziehen kann, jedoch einer Zeitspanne kein Datum!
Gruss,
.unreal

Ja, soviel ist klar. Ich sagte ja auch: Ich meinte, daß ich dt-ts und nicht umgekehrt machen wollte damals. Also an den genauen Fehler, den ich damals hatte kann ich mich nciht mehr erinnern. Ich weiß nur noch, daß ich mit dem "-"-Op Probleme hatte und mit DateTime.Subtract() dann nicht mehr. Kann aber auch sein, daß ich durch das Ändern des Codes einen Tippfehler weggemacht habe und es garnicht daran lag, daß ich "-" statt "Subtract" benutzte.