ich habe zwei Unix timestamps, z.B. 1501268400000 und 1501087994000.
Die Differenz beträgt 180406000
Nun möchte ich aus der Differenz die Anzahl Tage, Stunden, Minuten, Sekunden ausrechnen.
Denke, unsere Posts haben sich überschnitten (5-Minuten-Sperre und so).
Ist oben angehangen.
Befürchte aber, daß das Groh damit nicht viel anfangen kann, da Windows als OS.
themanfrommoon:
ich habe zwei Unix timestamps, z.B. 1501268400000 und 1501087994000.
Die Differenz beträgt 180406000
Nun möchte ich aus der Differenz die Anzahl Tage, Stunden, Minuten, Sekunden ausrechnen.
Der Rest sind Grundrechenarten höchstens 3. Klasse.
....die 3. Klasse ist lange her
Wer kann denn in der 3. Klasse C programmieren?
Die Unix Timestamps, die ich habe sind in Millisekunden.
Die Differenzen von beiden Timestamps habe ich ja bereits.
Also geht es nur noch darum aus einer Zahl in Millisekunden die Anzahl ganzer Tage, Stunden, Minuten und Sekunden auszurechnen.
Da steh ich grad n bisschen auf dem Schlauch, wie man das vernünftig löst.
In Excel habe ich es fast hinbekommen, aber eben nur fast. siehe Anhang
Excel macht da irgendwie einen Rundungsfehler?!
30.09.2017 23:23:17 ist als Unix Timestamp: 1506813797000 (in Millisekunden)
28.07.2017 08:00:00 ist als Unix Timestamp: 1501228800000 (in Millisekunden)
Die Differenz beträgt: 5584997000 (in Millisekunden)
Nun teile ich 5584997000 / (2460601000) und erhalte 64,6411689815, das kürze ich auf 64 volle Tage.
Dann rechne ich den Rest von 5584997000 / (2460601000) aus und teile den durch 60601000.
Da kommt dann 15,3880555555 bei raus, das kürze ich auf 15 volle Stunden.
Dann rechne ich den Rest von 55397000 / (60601000) und teile den durch 601000.
Da kommt dann 23,2833333293 bei raus, das kürze ich auf 23 volle Minuten.
Dann rechne ich den Rest von 1397000 / (601000) und teile den durch 1000.
Da kommt dann 17 bei raus, das kürze ich auf 17 volle Sekunden. (bei Excel kommt hier nun 16,9999997559 bei raus, was Excel dann zu 16 kürzt -> Fehler)
Also, Mathe krieg ich noch hin.
Aber wie geht das ganze jetzt möglichst geschickt in C?
Dividieren mit Rest gab es schon in der 3. Klasse.
Wer lesen kann, ist klar im Vorteil.
Über Deinem Beitrag habe ich doch die Lösung für UNIX-Timestamps geschrieben. Deine Zahlen sind per Definition keine. Du musst Deine Zahlen durch 1000 teilen.
habe ich gesehen.
Ich habe an meinem Post länger geschrieben als du für deine Antwort gebraucht hast.
Vielen Dank für deine Antwort!
Meine Zahlen sind so wie ich geschrieben habe.
Sie kommen aus einer Datenbank, die nicht auf meinem Mist gewachsen sind, UND das sind die gleichen Zahlen die man mit der Funktion millis() bekommt. Insofern passt das genau. micros() wäre nochmal um den Faktor 1000 größer.
Alles gut, Problem gelöst (hoffentlich, muss ich noch ausprobieren, ich bin aber sehr zuversichtlich)
Über Deinem Beitrag habe ich doch die Lösung für UNIX-Timestamps geschrieben. Deine Zahlen sind per Definition keine. Du musst Deine Zahlen durch 1000 teilen.
Jetzt verstehe ich erst was du meinst.
Asche auf mein Haupt.
In der Datenbank ist die "Zahl" als "1506813797000" hinterlegt.
Diese "Zahl" passt aber von der Größe in keine Zahlenvariable rein.
Das meintest du mit "ist keine Zahl".
Ja, hab ich jetzt verstanden.
....ähm und nun?
Mit welchem Variablentyp kann ich die "Zahl" denn auslesen und durch 1000 teilen?
Ich vermute mal als Text und dann die letzten drei Ziffern einfach abschneiden.
Wie macht man das am Besten?
Probier mal, ob Du sie in eine uint64_t rein bekommst.
Ist das eine SQL-Datenbank?
Dann kannst Du der auch das Teilen überlassen:
SELECT wert/1000 AS unixtime FROM ...
Ich habe übrigens nicht geschrieben, das ist keine zahl, sondern das ist kein UNIXtimestamp. Ein kleiner aber feiner Unterschied
Gruß Tommy
Edit: Da fällt mir ein: Du hast doch geschrieben, das wären Werte von millis() oder? Dann sollten sie in uint32_t rein passen.
Dann musst Du bei der Differenzbildung den Überlauf beachten.
Probier mal, ob Du sie in eine uint64_t rein bekommst.
Hab ich probiert, dann kommt allerdings bei Serial.print folgende Fehlermeldung:
call of overloaded 'print(uint64_t&)' is ambiguous
Ja, das ist schon eine SQL Datenbank, allerdings greife ich nicht auf die Datenbank zu, sondern über eine API bekomme ich ein JSON.
Dieses parse ich und bekomme dann den Wert geliefert.
Auf die SQL-Abfrage hast Du keinen Einfluss? Wo kommen die Werte her? Sind das millis-Werte - glaube ich eher nicht?
Ich mache keine SQL Abfrage, sondern eine http Abfrage an eine Middleware-API. (development:api:reference [wiki.volkszaehler.org])
Als Antwort kommt dann ein JSON.
Der Timestamp ist im Format: "ms (oder unix): Millisekunden seit 1.1.1970, 00:00 GMT"
Ich habe es jetzt so versucht, ich kriegs nicht hin
uint64_t zwischen = data_tuples0[0]; // Variable "LastTimestamp[i]" füllen mit Wert aus JSON (z.B. "1509121688067")
LastTimestamp[i] = zwischen / 1000 ;
Welcher Depp speichert eigentlich Unixtime*1000 (also in ms). Die Frage muss man wirklich mal stellen.
Das kann ich dir leider nicht beantworten. Das Ganze stammt von hier: http://volkszähler.org/
Ich habe es jetzt so versucht, ich kriegs nicht hin
uint64_t zwischen = data_tuples0[0]; // Variable "LastTimestamp[i]" füllen mit Wert aus JSON (z.B. "1509121688067")
LastTimestamp[i] = zwischen / 1000 ;
Die Differenzgeschichte ist das eine, da bin ich noch nicht soweit.
An einer anderen Stelle wollte jetzt doch lieber mit Zahlen hantieren.
Sprich, ich möchte aus dem geparsten JSON, welches z.B. den timestamp "1501268400000" durch 1000 teilt (oder die letzten drei Stellen abschneidet) und in eine Zahlenvariable speichert.