Herbert Lanz: Soziologe tut isch schwer beim Berechnen der Zeit

Hallo,

also ich hab Soziologie studiert - soviel als Entschuldigung für diese Frage.
Ich hab versucht, aus tausenstl die Zeit in Sekunden, Minuten und Studen zu berechnen.
Hier mein Werk:

  
function formatTime(time) {  	// time in tausenstl:  
	var h=parseInt(time/(6000*24)),  
	min=parseInt(time/6000),  
	sec=parseInt(time/100)-(min*60);  
	return(h>0?pad(h,2):"00")+":"+(min>0?pad(min,2):"00")+":"+pad(sec,2);  
	}  

Was sagt ihr, stimmt das so, kann man das so lassen?

Danke!
Herbert

  1. Moin,

    also ich hab Soziologie studiert - soviel als Entschuldigung für diese Frage.

    na gut, jeder macht mal Fehler. ;-)

    Ich hab versucht, aus tausenstl die Zeit in Sekunden, Minuten und Studen zu berechnen.

    Warum so umständlich? Die Tausendstel hast du doch vermutlich aus einem Date-Objekt bekommen. Dieses Objekt stellt aber auch Methoden zur Verfügung, um die Stunden, Minuten und Sekunden einzeln zu bekommen.

    function formatTime(time) {   // time in tausenstl:

    var h=parseInt(time/(600024)),
    min=parseInt(time/6000),
    sec=parseInt(time/100)-(min
    60);
    return(h>0?pad(h,2):"00")+":"+(min>0?pad(min,2):"00")+":"+pad(sec,2);
    }

    
    >   
    > Was sagt ihr, stimmt das so, kann man das so lassen?  
      
    Nein. Die Rechnung enthält zwei Kapitalfehler. Zum einen gehst du offenbar davon aus, dass eine Stunde 24\*6000 Millisekunden hat, das wären 144 Sekunden. Ein bisschen wenig, finde ich. Zweitens hast du beim Berechnen der Minuten versäumt, den schon ermittelten Brocken für die ganzen Stunden von time abzuziehen.  
    Und drittens verstehe ich nicht, welcher Gedanke der Zeile mit der Sekunden-Berechnung zugrundeliegt. Ähm, hast du vielleicht keine Tausendstel, sondern nur Hundertstel (aber selbst dann wär's falsch? Falls ja, wäre allerdings die Frage, wo man sowas herkriegt.  
      
    Deine Zeitberechnung ergibt jedenfalls bis zu 600 Stunden, 14 Minuten und 864000 Sekunden.  
      
    Schöne Ostern noch,  
     Martin  
    
    -- 
    In der Theorie stimmen Theorie und Praxis genau überein.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Tach!

      Die Rechnung enthält zwei Kapitalfehler.

      Und, wir hatten die Umstellung ja erst gestern, die Sommerzeit und dass damit manche Tage länger oder kürzer sind, ist in der Rechung auch nicht berücksichtigt.

      dedlfix.

    2. Besten Dank für die Antwort,

      Ich hab leider kein Date- Objekt sondern die Zeit wird mit "jquery.time" so berechnet:

        
      function startDurationMeasurement() {  
      	var count = 0;  
      	var timer = $.timer(  
      			function() {  
      				count++;  
      				$('table#duration tr td span.runningValueExplanation').text(formatTime(count));  
      			},  
      			1000,  
      			true  
      		);	  
      	timer.play();  
      	}  
      
      

      Das Problem ist also, dass ich mir das Ganze selber rausrechnen muss.
      Könnte mir vielleicht jemand schreiben, wie ich das am Besten machen kann - wäre sehr dankbar dafür.

      PS: Soziologie war ein Fehler - da hast du recht, aber was solls :-)

      lg
      Herbert

      1. Hallo,

        function startDurationMeasurement() {

        var count = 0;
        var timer = $.timer(
        function() {
        count++;
        $('table#duration tr td span.runningValueExplanation').text(formatTime(count));
        },
        1000,
        true
        );
        timer.play();
        }

          
        okay, dann macht sich jemand das Leben unnötig schwer. Eine Zeitmessung auf diese Weise nachzubauen, ist so ähnlich, als würde man eine Strickleiter am Balkon nutzen, obwohl das Haus einen Fahrstuhl hat. Aber gut, der Übung halber ...  
          
        
        > Das Problem ist also, dass ich mir das Ganze selber rausrechnen muss.  
        > Könnte mir vielleicht jemand schreiben, wie ich das am Besten machen kann - wäre sehr dankbar dafür.  
          
        Ich würde mit der kleinsten Einheit anfangen, der Sekunde. Und von dort aus zu größeren Einheiten vorgehen. Dafür verwende ich die Modulo-Division, die als Ergebnis immer den Rest einer ganzzahligen Division liefert, denn es gilt beispielsweise:  
          438 / 60 = 7 (Rest 18)  
        Also sind 438 Sekunden in gemischter Angabe 7 Minuten und 18 Sekunden.  
          
        ~~~javascript
        function getFormattedTime(time)   // takes elapsed time in milliseconds  
         { var msec, sec, min, hr;  
           var ft;                        // formatted time string  
          
           msec = time % 1000;            // get milliseconds, in case we might need it  
           time = Math.floor(time/1000);  // convert time to seconds, ignoring the milliseconds  
           sec  = time % 60;              // get seconds - a minute has 60 seconds  
           time = Math.floor(time/60);    // reduce time to full minutes  
           min  = time % 60;              // get minutes - similar to above, an hour has 60 minutes  
           time = Math.floor(time/60);    // reduce time to full hours  
           hr   = time % 60;              // get hours - a day has 24 hours  
        // if time is !=0 now, it contains the number of days, i.e. time was initially more than 24h  
          
           ft = (hr<10  ? "0" : "") + hr  + ":"  
              + (min<10 ? "0" : "") + min + ":"  
              + (sec<10 ? "0" : "") + sec;  
           return (ft);  
         }
        

        So long,
         Martin

        --
        Soziologen sind nützlich, aber keiner will sie haben.
        Bei Informatikern ist es gerade umgekehrt.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hi,

          copy & paste error detected:

          time = Math.floor(time/60);    // reduce time to full hours
             hr   = time % 60;              // get hours - a day has 24 hours

          So sollte es aussehen:

          time = Math.floor(time/60);    // reduce time to full hours
                hr   = time % 24;              // get hours - a day has 24 hours
          //                  ==

          Und falls der Zeitraum *wirklich* mehr als 24 Stunden sein kann und man die Tage weiter verwenden möchte wie im Kommentar in der Folgezeile angedeutet, muss time nochmal durch 24 dividiert werden, um von Stunden auf Tage zu kommen.

          Der Hinweis von dedlfix zu Unregelmäßigkeiten wegen der Sommer/Winterzeitumstellung ist natürlich irrelevant, wenn es nur um einen verstrichenen Zeitraum geht - wenn ein Vorgang drei Stunden dauert, dann bleiben das drei Stunden, auch wenn zwischendurch auf Sommerzeit umgestellt wurde.

          Ciao,
           Martin

          --
          Wer im Glashaus sitzt, sollte Spaß am Fensterputzen haben.
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          1. Hallo nochmal,

            also der jetzige Osterspaziergang hat mir ziemliche Probleme aufgezeigt,
            Ich verwende ja Phonegap und jQuery Mobile.
            Ich hab auf einer data-role="page" eine Google Maps, ein Zeitanzeige (wie lang dauert das tracking schon), eine Geschwindigkeitsanzeige und eine Längenanzeige.

            Wenn ich die map z.B. herumziehe, dann steht die Zeitanzeige - da geht dann gar nichts mehr - is also ziemlich falsch.
            Ich bräuchte jetzt entweder einen eigenen Thread in dem die Zeitberechnung und Anzeige läuft (Das wird es nicht geben, da das Ganze ja in einem embedded Browser läuft) oder ich hol mir die Zeit aus den Timestamps der Position- Objekte raus.
            Das hätte den Vorteil, dass es genau(er) ist aber den Nachteil, dass die Uhr nicht alle Sekunden raufzählt sondern nur, nachdem ich einen neuen Lat/Lng- Punkt erhalten haben (momentan alle 5 Sekunden)

            Ich habe also multible Probleme - von da her ist Soziologie wieder einfacher :-)

            Was sagt ihr dazu, was ich da machen soll? Bin dankbar für jeden Hinweise.

            lg
            Herbert

            1. Mahlzeit,

              also der jetzige Osterspaziergang hat mir ziemliche Probleme aufgezeigt,
              Ich verwende ja Phonegap und jQuery Mobile.
              Ich hab auf einer data-role="page" eine Google Maps, ein Zeitanzeige (wie lang dauert das tracking schon), eine Geschwindigkeitsanzeige und eine Längenanzeige.

              das sind Aspekte, die du eigentlich schon im Startposting hättest erwähnen sollen - vor allem die Tatsache, dass das auf einem Mobilgerät laufen soll, wo die technischen Möglichkeiten (und evtl. auch die Rechenleistung) deutlich eingeschränkt sein können.

              Wenn ich die map z.B. herumziehe, dann steht die Zeitanzeige - da geht dann gar nichts mehr - is also ziemlich falsch.

              Ja, das wundert mich nicht. Denn wenn ich deinen eingangs gezeigten Code richtig verstehe, möchtest du eine Zählfunktion regelmäßig jede Millisekunde aufrufen. Da wird sogar schon so mancher Desktop-PC die weiße Fahne hissen.
              Du könntest natürlich deine Timerfunktion von 1000mal pro Sekunde (also 1ms Auflösung) auf 1mal pro Sekunde umstellen. Das sollte auch ein Smartphone-Browser noch schaffen. Natürlich musst du dann deine Aufbereitung so umschreiben, dass die Umwandlung von Millisekunden in Sekunden entfällt.

              Ich bräuchte jetzt entweder einen eigenen Thread in dem die Zeitberechnung und Anzeige läuft (Das wird es nicht geben, da das Ganze ja in einem embedded Browser läuft) oder ich hol mir die Zeit aus den Timestamps der Position- Objekte raus.

              Letzteres halte ich für zielführend, wenn die permanente Anzeige der aktuell vergangenen Zeit nicht unbedingt nötig ist. Dann kannst du am Anfang einer Etappe mit new Date() einen Timestamp A holen, am Ende einer Etappe einen Timestamp B, und dann A.getMilliseconds von B.getMilliseconds abziehen.

              Ciao,
               Martin

              --
              Er war ein Mann wie ein Baum. Sie nannten ihn Bonsai.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(