Berechnung der Zeitdifferenz zweier Uhrzeiten

Startseite Foren Deutsches LiveCode-Forum Berechnung der Zeitdifferenz zweier Uhrzeiten

Ansicht von 6 Antwort-Themen
  • Autor
    Beiträge
    • #3198
      gfz
      Teilnehmer

        Freunde und Eperten von Livecode!
        Ich möchte eine kleine Anwendung zur Erfassung meiner Überstunden schreiben.
        Beim Versuch die Zeitdifferenz zwischen Dienstende laut Plan und tatsächlichem Ende zu ermitteln aus den beiden Feldern “Jetzt” und “Dienstende” führt der folgende Versuch zu einer Zeitdauer, die eine Stunde zuviel ergibt (wäre an und für sich nicht schlecht, aber der Dienstgeber rechnet sicher genau :-)).

        convert the text of fld "Dienstende" to seconds
         put it into tEnde
         convert the text of fld "Jetzt" to seconds
         put it into tJetzt
         convert (tJetzt - tEnde) to time
         put it into fld "Ausgabe"

        Wo muss da etwas korrigiert werden, damit die Berechnung stimmt?
        liebe Grüße
        Georg

      • #3200
        Torsten
        Teilnehmer

          Hi Georg,

          welche Werte stehen in den Feldern drin? So kann ich gerade nicht nachvollziehen, wie das berechnet wird.

          Ausserdem scheint der Ausgabewert in Sekunden zu bestehen. Was du also eigentlich noch machen musst, ist die Sekunden in fld “Ausgabe” in Stunden und Minuten umzurechnen, oder?

        • #3202
          Torsten
          Teilnehmer

            Vorschlag:

            
            put time into tSeconds
            put trunc(tSeconds/3600) into tHours -- Anzahl der Stunden
            put trunc(tSeconds/60) into tMinutes
            put trunc(tMinutes - (tHours * 60)) into tMinutes
            put tSeconds- ((tHours*3600) + (tMinutes * 60)) into tSeconds
            put tHours & ":" & tMinutes & ":" & tSeconds into field "Ausgabe"
            

            Die Sekundenanzahl von 3664 ergibt dann in Ausgabe: 1:1:4 = 1 Stunde, 1 Minute und 4 Sekunden.

          • #3204
            gfz
            Teilnehmer

              Hallo Torsten!
              Danke, dass Du Dir für mein Problem Zeit nimmst.
              Hier die Inhalte der Felder:
              “Jetzt” 10:38 (Dieser Wert kommt mit: “put the system time into fld …” zustande.)
              “Dienstende” 07:30 (Diesen Wert schreibe ich selbst rein.)
              Die Umrechnung – dachte ich – würde “convert” für mich erledigen. Zumindest hätte ich dieses “Versprechen” aus der Dokumentation so interpretiert :-).
              Grüße aus Wien
              Georg

            • #3206
              gfz
              Teilnehmer

                Hi Torsten!
                Oh, du hast noch einen Vorschlag nachgereicht – Danke, den habe ich während meiner Antwort nicht bemerkt.
                Ich habe dann diese Variante als funktionierende Alternative gewählt:

                   if fld "Dienstende" is not empty then
                      convert the text of fld "Dienstende" to dateitems
                      put it into tEnde
                      put (item 4 of tJetzt)*60 + (item 5 of tJetzt) into tDauer
                      //answer tDauer
                      subtract ((item 4 of tEnde)*60+(item 5 of tEnde)) from tDauer
                     // answer tDauer
                      put format("%02d", tDauer div 60) & ":" & format("%02d",tDauer mod 60) into fld "Ausgabe"
                   end if

                Aber nach genauerem Durchsehen der Doku zu convert, wollte ich wissen, ob es nicht auch einfacher geht über “convert … to seconds”. Scheinbar doch nicht auf Anhieb – oder ich habe da was falsch verstanden – was wohl eher der Fall sein dürfte ;-).
                LG
                Georg

              • #3211
                gfz
                Teilnehmer

                  Eine Funktion zur Berechnung solcher Probleme (Zeitdauer) gibt es in LiveCode wohl nicht, oder?
                  Bei der Suche nach “Duration” fand ich in der Doku nur die Player-Eigenschaft “the duration”.
                  LG,
                  Georg

                • #3216
                  Torsten
                  Teilnehmer

                    Hi Georg,

                    aha! Leider bedeutet convert nicht genau das, was Du Dir erhoffst .-)

                    Man muss sich überlegen, wie man die Zeitangaben miteinander verrechnet. In Deinem Fall ist es wohl so, dass Du jeweils STUNDE:MINUTE in beiden Feldern stehen hast und die Differenz zwischen beiden in STUNDE:MINUTE haben möchtest.

                    Wenn das so ist, dass schlage ich folgendes vor (unter der Annahme, dass Du nicht über Mitternacht hinaus arbeitest 😉 :

                    on mouseUp 
                    put field "Dienstende" into tDienstende
                    put field "Jetzt" into tJetzt
                    
                    set itemdelimiter to ":"
                    
                    -- die Stunden * 60 = Minuten, die sich aus den Stunden ergeben
                    put (item 1 of tDienstende) * 60 into tEndeMinuten 
                    
                    -- plus die Minuten, die nach dem Doppelpunkt angegeben sind
                    put item 2 of tDienstende + tEndeMinuten into tEndeMinuten 
                    
                    -- dasselbe für die Jetzt-Zeit
                    put (item 1 of tJetzt) * 60 into tJetztMinuten
                    put item 2 of tJetzt + tJetztMinuten into tJetztMinuten
                    
                    -- Jetzt-Minuten minus Ende-Minuten = die Minuten, die zu mehr gearbeitet hast
                    put tJetztMinuten - tEndeMinuten into tUeberminuten 
                    
                    -- jetzt muss in Stunden und Minuten zurückgerechnet werden
                    put trunc(tUeberminuten/60) into tUeberStunden
                    put tUeberminuten - (tUeberstunden * 60) into tUeberminuten
                    
                    answer "Ich habe heute" && tUeberstunden && "Stunden und" && tUeberminuten && "Minuten mehr gearbeitet!"
                    end mouseUp
                Ansicht von 6 Antwort-Themen
                • Du musst angemeldet sein, um auf dieses Thema antworten zu können.