hawkmaster1: gettimeofday() fehlerhaft?

Hallo zusammen, ich habe gerade ein merkwürdiges Verhalten der gettimeofday() Funktion festgestellt.

Wenn ich den Code unten mehrmals hintereinander ausführe dann habe ich in den meisten Fällen die Mikrosekunden $mytime_arr['usec'] als sechstelligen Wert. Ab und zu aber nur fünfstellig.

$mytime_arr = gettimeofday();
$milliseconds = $mytime_arr['usec'] / 1000;
echo "1. die milliseconds sind " . $mytime_arr['usec'] . " und durch 1000 $milliseconds <br>";
$roundedmilliseconds = round($milliseconds);
echo "die rounded milliseconds sind $roundedmilliseconds <br>";
$millisecondstimestamp = $mytime_arr['sec'] . $roundedmilliseconds;

Ich brauche später einen 13 stelligen Zeitstempel. Aber so ist das ja nicht zuverlässig weil ab und zu Stellen fehlen bzw. zu wenig sind. Ist das ein Fehler von gettimeofday()?

vielen Dank Gruss hawk

  1. Hallo hawkmaster1,

    Ab und zu aber nur fünfstellig.

    Bestimmt manchmal auch noch wenigerstellig.

    Ich brauche später einen 13 stelligen Zeitstempel. Aber so ist das ja nicht zuverlässig weil ab und zu Stellen fehlen bzw. zu wenig sind. Ist das ein Fehler von gettimeofday()?

    Ich denke nicht. Der Wert von Microsekunden ist vom Typ Zahl, du müsstest also ggf. führende Nullen auffüllen.

    Bis demnächst
    Matthias

    --
    Signaturen sind bloed (Steel) und Markdown ist mächtig.
    1. Hallo Matthias, danke dir.

      Ich denke nicht. Der Wert von Microsekunden ist vom Typ Zahl, du müsstest also ggf. führende Nullen auffüllen.

      du meinst das einfach die Nullen vorne fehlen bzw. nicht angezeigt werden? Wenn ich also eine Mikrosekunde $mytime_arr['usec'] von 57379 bekomme, sollte ich vorne eine Null auffüllen? also 057379 ?

      Ich müsste also noch eine Prüfung einbauen, wenn Zahl nicht 6 stellig dann auffüllen? Gruss hawk

      1. Hallo hawkmaster1,

        du meinst das einfach die Nullen vorne fehlen bzw. nicht angezeigt werden?

        Ja. Je nach dem wie alt die Sekunde ist.

        Ich müsste also noch eine Prüfung einbauen, wenn Zahl nicht 6 stellig dann auffüllen?

        Ja. Allerdings würde mMn. microtime genau das leisten, was du brauchst, ohne irgendwelche Handstände und Bocksterzer.

        Bis demnächst
        Matthias

        --
        Signaturen sind bloed (Steel) und Markdown ist mächtig.
        1. Hallo,

          Ja. Allerdings würde mMn. microtime genau das leisten, was du brauchst, ohne irgendwelche Handstände und Bocksterzer.

          nein, das habe ich eben ausprobiert. bzw. das lieferte mir die gleichen Resultate wie gettimeofday.

          Ich habe es nun mit sprintf dafür gesorgt das die gerundeten Millisekunden immer 3 Zahlen sind.

          Gruss hawk

          1. Hallo hawkmaster1,

            Ich habe es nun mit sprintf dafür gesorgt das die gerundeten Millisekunden immer 3 Zahlen sind.

            <klugscheißer>
              z.B. 42, 17 und 34?  
            </klugscheißer>
            

            Bis demnächst
            Matthias

            --
            Signaturen sind bloed (Steel) und Markdown ist mächtig.
            1. Deine Bemerkung verstehe ich leider nicht.

              Was ist daran falsch? $formatted_milliseconds = sprintf("%03d", $roundedmilliseconds);

              Bitte um Erklärung.

              <klugscheißer>
                z.B. 42, 17 und 34?  
              </klugscheißer>
              
              1. Hallo,

                <klugscheißer>
                  z.B. 42, 17 und 34?  
                </klugscheißer>
                

                Vielleicht hätte er besser als drei Zahlen 42, Pi und Minus e aufzählen sollen.

                Gruß
                Kalk

              2. Hallo,

                <klugscheißer>
                  z.B. 42, 17 und 34?  
                </klugscheißer>
                

                Deine Bemerkung verstehe ich leider nicht.

                du hast von drei Zahlen gesprochen. Matthias hat dir drei Zahlen als Beispiel genannt.

                Was ist daran falsch?
                $formatted_milliseconds = sprintf("%03d", $roundedmilliseconds);

                Nichts. Nur passt der Code nicht zu deiner Aussage. Er erzeugt nicht drei Zahlen, sondern einen String, der drei oder mehr Ziffern enthält.

                So long,
                 Martin

              3. @@hawkmaster1

                Deine Bemerkung verstehe ich leider nicht.

                Vermutlich meinst du … – genau andersrum.

                LLAP 🖖

                --
                Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
        2. Hallo Matthias,

          Ja. Allerdings würde mMn. microtime genau das leisten, was du brauchst, ohne irgendwelche Handstände und Bocksterzer.

          habe es nochmals mit microtime() ausprobiert. Jetzt habe ich es glaube ich kapiert was du meintest.

          Mit gettimeofday und $mytime_arr['usec'] wird z.b. geliefert: 5451 anstatt der erwarteten 6 stelligen Zahl.

          microtime() liefert dagegen.

          0.00545100 1438082846 Es füllt also die Nullen automatisch auf. Man müsste also nur die vordere Null bis zum Punkt abschneiden und dann 6 Stellen nehmen. Hast du das gemeint wegen den Nullen auffüllen?

          Gruss hawk

      2. Hallo,

        Der Wert von Microsekunden ist vom Typ Zahl, du müsstest also ggf. führende Nullen auffüllen.

        du meinst das einfach die Nullen vorne fehlen bzw. nicht angezeigt werden?

        natürlich, genau das. Das ist doch bei Zahlenwerten immer so, wenn man nicht ausdrücklich etwas anderes angibt.

        Wenn ich also eine Mikrosekunde $mytime_arr['usec'] von 57379 bekomme, sollte ich vorne eine Null auffüllen? also 057379 ?

        Wenn du eine derart formatierte usgabe haben willst, musst du die Zahl eben mit führenden Nullen formatiert ausgeben. Zum Beispiel mit sprintf() und der Formatangabe "%06d".

        Ich müsste also noch eine Prüfung einbauen, wenn Zahl nicht 6 stellig dann auffüllen?

        Man kann es auch so umständlich machen ... ;-)

        So long,
         Martin

      3. Ich müsste also noch eine Prüfung einbauen, wenn Zahl nicht 6 stellig dann auffüllen?

        Schau dir mal die sprintf-Funktion an.

      4. Tach!

        du meinst das einfach die Nullen vorne fehlen bzw. nicht angezeigt werden?

        5 Mikrosekunden sind 5 Mikrosekunden. Wenn du 000005 angezeigt bekommen möchtest, musst du die Integer-Zahl in einen formatierten String bringen. sprintf() eignet sich dafür, oder str_pad().

        Wenn ich also eine Mikrosekunde $mytime_arr['usec'] von 57379 bekomme, sollte ich vorne eine Null auffüllen? also 057379 ?

        Das musst du dir schon selbst überlegen, ob du das so brauchst oder nicht.

        dedlfix.

  2. Hallo,

    ich habe gerade ein merkwürdiges Verhalten der gettimeofday() Funktion festgestellt.

    so merkwürdig finde ich das gar nicht.

    Wenn ich den Code unten mehrmals hintereinander ausführe dann habe ich in den meisten Fällen die Mikrosekunden $mytime_arr['usec'] als sechstelligen Wert. Ab und zu aber nur fünfstellig.

    Du wirst -mit abnehmender Wahrscheinlichkeit- auch irgendwann mal Fälle haben, in denen usec nur vier- oder dreistellig ist. Auch einstellig ist möglich. Betrachte die gelieferten Microsekunden als Nachkommaanteil der Sekunden - das ist also ein Wert von 0..999999.

    Ist das ein Fehler von gettimeofday()?

    Nein. Nur eine ungewöhnliche Handhabung von Werten.

    So long,
     Martin

  3. Hallo zusammen,

    Ich brauche später einen 13 stelligen Zeitstempel.

    Wofür und warum gerade 13 stellig und überhaupt ;)

    PS: Wenn Du der Empfänger des Zeistempels bist, na dann kannst Du Dich doch mal darauf einstellen, dass es nicht immer 13 Stellen sind oder ?

    ;) Dag

  4. Hallo und guten Tag,

    Du müsstest dich als erstes mal entscheiden, was für einen Datentyp Du überhaupt haben möchtest. Sol das ganze Ergebnis eine Zahl in Mikrosekunden sein? Oder soll das ganze Ergebnis nur einen String einer bestimmten Länge darstellen?

    Welche Aussagekraft soll der String dann haben?

    Ist es also egal, an welcher Stelle der Ziffernfolge der Dezimalpunkt stand, den Du nicht haben willst?

    Grüße
    TS