Zeitberechnung



  • Hallo, ich habe eine kleine Problem mit berechnung von Zeiten. Ich möchte in meinem Projekt eine Dauer errechnen anhand von 2 Zeiten die Zeiten werden durch drücken auf 2 Buttons mit

    Edit1->Text=DateTimeToStr(Now());
    

    in jeweis 2 Edit Felder geschrieben.

    Danch errechne ich die Dauer durch

    TDateTime dttime = StrToDateTime(Edit1->Text); //Zeit einlesen
    TDateTime dttime2 = StrToDateTime(Edit2->Text); //Zeit einlesen
    
    TDateTime dttime3 = (dttime2-dttime); //Berechnung
    
    Edit3->Text=dttime3; //Ausgabe in einem dritten Edit Feld
    

    Mein Problem ist nun, wenn ich z.B im Edit1 "22.02.2006 08:10:22" und im Edit2 "23.02.2006 08:10:30" stehen habe kommt bei der Ausgabe im Edit3 "31.12.1899 00:00:08" was ja falsch ist. Ich hätte aber gerne das er mir nur die Zeit anzeigt und einfach 24 Stunden addiert also als Ausgabe "24:00:08"



  • Zeitangaben werden in C normalerweise als Sekunden seit Tag 0 angegeben (und anscheinend liegt Tag 0 für TDateTime um 1900 herum). Für Zeitdifferenzen benötigst du einen anderen Datentyp (ich tippe auf "TDateTimeSpan" oder "TDateTimeDiff").



  • Ich hab mal was ähnliches für eine Countdown gebraucht, da ich nix passendes gefunden habe, habe ich es so gemacht:

    int iCountdown = (int) (TDateTime(dtDelivery.Val - TDateTime::CurrentDateTime()).Val * 24 * 60 * 60); // hier sind die beiden Ausgangsdaten (datums??)
    int Tage, Std, Min , Sek;
    Sek = iCountdown % 60;
    iCountdown -= Sek;
    iCountdown /= 60;
    Min = (iCountdown) % 60;
    iCountdown -= Min;
    iCountdown /= 60;
    Std = (iCountdown) % 24;
    iCountdown -= Std;
    iCountdown /= 24;
    Tage = (iCountdown);
    

    Aus Tage, Std, Min, Sek kanns Du dann einen String nach Deinen Wünschen gestalten.



  • Sebastian.M schrieb:

    Ich hätte aber gerne das er mir nur die Zeit anzeigt und einfach 24 Stunden addiert also als Ausgabe "24:00:08"

    Nur zum Nachdenken: kennst Du so eine Uhrzeit? ich nicht, da meine Uhr nur 23:59:59 zulässt. Falls ja interessiert es mich, ob es außer der babilonischen Zeitrechnung noch andere Zeitangaben für einen Tag gibt, welche Deine Zeit zulassen! 🙂

    ps: ich fand es nur witzig! 🙂

    Gruß Gerd



  • Wer sagt das die Zeit nur bis 23:59:59 geht? Nach 24 Stunden beginnt zwar ein neuer Tag aber das spielt doch keine Rolle. Statt 2 Tage kann man doch auch 48 Stunden sagen und genau das ist was ich in meinem Programm will.



  • Sieh Dir doch bitte mein Beispiel in Ruhe an und probiere es aus. Das geht auch ohne Tage...



  • Sebastian.M schrieb:

    Statt 2 Tage kann man doch auch 48 Stunden sagen und genau das ist was ich in meinem Programm will.

    Dann darfst du die Werte aber nicht mehr als TDateTime verwenden (das ist es, was ich dir dort oben erklären wollte), sondern mußt sie dir selber so zerlegen, wie du sie brauchst. Entweder du findest in der BCB-Hilfe heraus, welche Klasse für Zeitdifferenzen verwendet wird (Tip: was ist der Rückgabewert von TDateTime::operator-(const TDateTime&)?) oder du passt den Code von Joe_M. an deine Bedürfnisse an.



  • Ich wäre auch damit zufrieden wenn ich "01.00.0000 00:00:08" angezeigt bekomme denn "26.02.2006 10:54:32" - "26.02.2006 10:54:40" wäre nämlich dieses Ergebniss. Aber C++ kennt anscheinend das Jahr 0 bzw. den Monat 0 nicht. Gibt es noch eine andere Möglichkeit außer die von Joe_M?



  • Edit3->Text=IntToStr(HoursBetween(dttime,dttime2))+dttime3.TimeString().SubString(3,6);
    


  • Bekomme die Meldung das HoursBetween eine undifinierte Funktion ist!?



  • HoursBetween gibt es erst seit BCB 6.



  • Und dann auch nur, wenn man ein DateUtils inkludiert.



  • Fincki schrieb:

    HoursBetween gibt es erst seit BCB 6.

    Kann man die BCB 5 User hier im Forum nicht in einen extra Oldie Bereich verbannen ?
    Selbst der Builder 6 ist nun schon in die Jahre gekommen.



  • Sebastian.M schrieb:

    Aber C++ kennt anscheinend das Jahr 0 bzw. den Monat 0 nicht.

    Klar, schließlich muß es auch mit halbwegs verwertbaren Zahlenwerten rechnen können ("Sekunden seit Jahr '0'" sprengt etwas die Grenzen von int) - deshalb wird ein (meist willkürlicher) Zeitpunkt als "Tag 0" festgelegt, von dem aus die Zeiten gezählt werden.



  • Also ich habe jetzt das Beispiel von Joe_M übernommen. Das hat leider auch nicht geklappt, bekomme die Fehlermeldung "Undefiniertes Symbol 'dtDelivery'" Was mache ich falsch?



  • Du mußt dort natürlich deine eigenen Variablen einsetzen, damit das funktionieren kann (dtime bzw. dtime2 (oder direkt die StrToDatetime()-Aufrufe) statt dtDelivery und TDateTime::CurrentDateTime()).

    (PS: Wie gut beherrschst du eigentlich die Grundlagen von C++?)



  • Nicht so gut wie man sieht. Das mit Joe_M's Beispiel hat jetzt geklappt, nur das ich noch ein kleines Problem habe. Ich habe den Quelltext nun so geändert das er mir die Minuten anzeigt die Zwischen den beiden Werten liegt. Das Problem ist nun das ich dies auch gerne in Stunden,Minuten angezeigt bekommen will. Wenn ich nun die Minuten noch mal durch 60 teile und dann ausgebe dann zeigt er mir nur die vollen Stunden an und keine Kommastelle. Wie mache ich es das er auch 2 Stellen hinter dem Komma zeigt?



  • schau dir mal in der BCB-Hilfe die Datentypen an.

    Integer hat keine Kommastellen
    float schon



  • Sebastian.M schrieb:

    Wenn ich nun die Minuten noch mal durch 60 teile und dann ausgebe dann zeigt er mir nur die vollen Stunden an und keine Kommastelle. Wie mache ich es das er auch 2 Stellen hinter dem Komma zeigt?

    Versuch's mal mit dem Modulo-Operator:

    TString zeit = IntToStr(min/60)+":"+IntToStr(min%60);
    

    (wie du bei den Minuten führende Nullen angezeigt bekommst, müsstest du mal in der BCB-Hilfe nachschlagen)


Anmelden zum Antworten