Uhrzeiten addieren



  • Hallo @alk,

    bei Fragen zu den VCL-Datentypen zuerst in die Doku schauen: Unterstützung für Datum und Uhrzeit (in deinem Fall unter "Berechnungen mit Datums- und Uhrzeitwerten" z.B. HoursBetween und IncHour).


  • Mod

    Naja, addieren wirst du Uhrzeiten hoffentlich nicht können.Wenn deine Logik nach dem Ergebnis von 3 Uhr plus 7 Uhr verlangt, dann stimmt was nicht mit der Logik 🙂



  • @SeppJ sagte in Uhrzeiten addieren:

    Naja, addieren wirst du Uhrzeiten hoffentlich nicht können.Wenn deine Logik nach dem Ergebnis von 3 Uhr plus 7 Uhr verlangt, dann stimmt was nicht mit der Logik 🙂

    Da sind die Delphianer stumpf. Der TDateTime Datentyp ist der OLE Zeitstempel von Microsoft (Repräsentation als double in Tagen seit 1.1.1900, Nachkommaanteil bestimmt die Uhrzeit anteilig, zB 0.25 = 6h). Die machen es sich bei der Addition einfach und addieren die beiden double-Werte zum Endergebnis. Es gibt auch sowas wie TTimespan, den muss man sich allerdings selbst aus Stunden, Minuten, etc. zusammenbauen.


  • Mod

    @DocShoe sagte in Uhrzeiten addieren:

    @SeppJ sagte in Uhrzeiten addieren:

    Naja, addieren wirst du Uhrzeiten hoffentlich nicht können.Wenn deine Logik nach dem Ergebnis von 3 Uhr plus 7 Uhr verlangt, dann stimmt was nicht mit der Logik 🙂

    Da sind die Delphianer stumpf. Der TDateTime Datentyp ist der OLE Zeitstempel von Microsoft (Repräsentation als double in Tagen seit 1.1.1900, Nachkommaanteil bestimmt die Uhrzeit anteilig, zB 0.25 = 6h). Die machen es sich bei der Addition einfach und addieren die beiden double-Werte zum Endergebnis. Es gibt auch sowas wie TTimespan, den muss man sich allerdings selbst aus Stunden, Minuten, etc. zusammenbauen.

    Das ist nicht stumpf, das ist unlogisch. Das Ergebnis hängt hier ja sogar vom internen Bezugspunkt ab, was das doppelt sinnlos macht. Modellierungsfehler. Traurig für eine Sprache, die ihre Wurzeln darin hat, saubere Datenstrukturen und strukturierte Programmierung zu lehren.



  • Ich habe jetzt folgendes gemacht:

    TTime Arbeitsbeginn = MaskEdit1->Text;
    TTime Arbeitsende = MaskEdit2->Text;
    
    TTime Differenz = Arbeitsende-Arbeitsbeginn;
    
    MaskEdit3->Text=Differenz;  //gesamte Arbeitszeit
    
    TTime Pause = MaskEdit7->Text;
    
    MaskEdit4->Text = Differenz- Pause;   //gesamte Arbeitszeit - Pause 30 Minuten
    

    Das funktioniert soweit, nur dass die 30 Minuten auf 60 Minuten gerundet werden.



  • So funktioniert es erstmal mit TEdit:

    TDateTime Arbeitsbeginn = MaskEdit1->Text;
    TDateTime Arbeitsende = MaskEdit2->Text;
    TDateTime Arbeitsstunden = MaskEdit6->Text;

    Edit1->Text= Arbeitsende-Arbeitsbeginn;
    Edit2->Text= Arbeitsende-Arbeitsbeginn-Arbeitsstunden;



  • Hallo,
    leider kennt man kleines Programm den Befehl "HoursBetween" nicht.
    Weiß Jemand, welche Datei ich mit include ( include ???.h)hinzufügen muss?

    TTime time1, time2;

    time1 = Time();
    time2 = Time();

    edTime1->Text = TimeToStr(time1);
    edTime2->Text = TimeToStr(time2);

    Memo1->Lines->Add("Hours between: " + FloatToStr(HoursBetween(time1, time2)));



  • @alk
    <System.DateUtils.hpp> inkludieren. Steht auch in der Hilfe.



  • Welche RAD Studio Version hast du denn?



  • Ich benutze die kostenlose Version, ich meine 11.1, kann ich von hier jetzt schlecht sagen.

    -> C++Builder Community Edition



  • Ich dachte, vllt. hast du noch eine ganz alte Version vom RAD Studio (bzw C++ Builder).

    Klappt es denn mit der Antwort von @DocShoe?



  • Kann erst heute Abend sagen....



  • Ich benutze die Version: Embarcadero® C++Builder 10.4

    Mit der <System.DateUtils.hpp> funktioniert es soweit, nur für eine Zeit von 06:00 bis 00:00 Uhr errechnet die Funktion 6 Stunden, müssen natürlich 18 Stunden sein.



  • 0:00h meint die Uhrzeit des selben Tages wie 6:00h, also ist die Differenz 6 Stunden.

    HoursBetween:

    HoursBetween gibt immer ein positives Ergebnis zurück und daher sind die Parameterwerte austauschbar.

    Wenn du 0:00h des nächsten Tages haben möchtest, dann mußt du TDateTime verwenden (und unterschiedliche Datumswerte angeben).



  • Kannste dir aber auch selber bauen:

    double HoursBetween( TDateTime dt1, TDateTime dt2 )
    {
       double const diff = dt1 > dt2 ? dt1.dVal - dt2.dVal : dt2.dVal - dt1.dVal;
       return diff * 24;
    }
    


  • Ich habe mir auch sowas in dieser Richtung gedacht, konnte aber noch nicht viel machen, ich habe gerade wenig Zeit.


Log in to reply