Intelligente Wege um Zeit in einer 32 bit cell zu speichern (PAWN)
-
Hey Leute,
ich hoffe ich bin der Section richtig, es dreht sich um Pawn - ist aber nicht unbedingt sprachen abhängig, und da dachte ich C kommt wohl am nächsten.
Ich suche nach einer möglichst effizienten, schnellen und einfachen Möglichkeit einen aktuellen Timestamp von Jahr Monat Tag Stunde Minute Sekunde in eine 32 bit Cell Variable zu speichern.
Welche Algorithmen sind da empfehlenswert?
Grüße
-
Naja, das am dichtesten Gepackte wäre eine Abwandlung des UNIX-Zeitstempels (Sekunden seit 1.1.1970). Durch einen vorzeichenlosen 32bit-Integer kriegst du damit einen Bereich von etwa 136 Jahren abgebildet.
Das ist nicht ganz trivial, aber auch nicht allzu kompliziert handzuhaben. Lass Null Mitternacht deines Starttages sein, dann kriegst du
uint32_t timestamp = 1273612320; // nur als Beispiel uint32_t tmp = timestamp; int sekunden = tmp % 60; tmp /= 60; int minuten = tmp % 60; tmp /= 60; int stunden = tmp % 24; tmp /= 24; // tmp ist jetzt die Anzahl der Tage seit deines Startdatums
Von da an kannst du das ganze ähnlich wie ein julianisches Datum behandeln (die einfachste Methode wäre, auf tmp das julianische Datum deines Starttages draufzurechnen und den Algorithmus wie angegeben zu übernehmen).
-
Über Pawn hab ich jetzt allerdings das Problem, dass ich nur Tag, Monat, Jahr und Zeit zur Verfügung habe, nicht aber des Zeitstempel als solchen.
Wollte mir aus diesen eine geschickte Umrechnung basteln.
Auf welcher Umrechnung basiert der Unix Zeitstempel?
-
Ums nochma zu verdeutlichen.
Ich hab die Variablen Jahr, Monat, Tag, Stunde, Minute, Sekunde zur Verfügung.
Jahr ist sogar vernachlässigbar, müsste mir also nur einen geschickten Integer Wert aus den anderen basteln.
-
Was stört dich denn an der Lösung von Seldon? Denk noch mal darüber nach, ich glaube du hast sie falsch verstanden.
-
Glaub ich auch ;).
uint32_t timestamp = 1273612320; // nur als Beispiel
Welches Datum ist das, Mitternacht von?
-
Das sind die Sekunden ab Mitternacht an einem von dir gewählten fixen Starttag. Welche Wahl gut ist, hängt von deinen Ansprüchen ab. Will man zeitgenössische Datumsangaben speichern, wird, wie schon gesagt, normalerweise der 1.1.1970 verwendet. Aber wir wissen ja nicht was du vor hast. Willst du z.B. Daten aus dem Jahr 50 v. Chr. speichern, musst du einen anderen Fixtag wählen.
-
Außerdem hängt es davon ab, wozu die Timestamps benutzt werden sollen. Nur zum Vergleichen und Sortieren? Dann kann man durchaus ein Jahr mit 512 Tagen zu 16 Monaten mit 32 Tagen annehmen. Und eine Minute hat natürlich 64 Sekunden. Man kann damit auch supi rausfinden, wer länger als 25 Jahre im Geschäft ist. Nur halt nicht, wieviele Tage das sind.
-
^^, möchte den Timestamp größten Teils zum Vergleich im Sekunden, Minuten und Stundenbereich anwenden, allerdings brauche ich die Tage und zum. die Monate, damit ich bei einem Vergleich am z.B. nä. Tag nicht falsche Ergebnisse bekomme.
-
juice122 schrieb:
^^, möchte den Timestamp größten Teils zum Vergleich im Sekunden, Minuten und Stundenbereich anwenden, allerdings brauche ich die Tage und zum. die Monate, damit ich bei einem Vergleich am z.B. nä. Tag nicht falsche Ergebnisse bekomme.
Nur Vergleichen oder auch Differenzberechnung? Willst Du ausrechnen, wieviele Sekunden von 20.2.1992,15:30:45 bis 10.3.1992,14:47:30 vergangen sind?
-
Differenz. Aber wie gesagt ist das Jahr dabei zu vernachlässigen.
Unabhängig von obiger Lösung, ich hatte mir mal überlegt die Variablen einfach aneinander zurechen.
Aus dem 31.12 um 23:59:59 würde dann 1231235959 werden.
Ist das empfehlenswert oder sollte ich lieber dem Vorschlag von Volkard nachgehen?
-
juice122 schrieb:
Differenz. Aber wie gesagt ist das Jahr dabei zu vernachlässigen.
Unabhängig von obiger Lösung, ich hatte mir mal überlegt die Variablen einfach aneinander zurechen.
Aus dem 31.12 um 23:59:59 würde dann 1231235959 werden.
Ist das empfehlenswert oder sollte ich lieber dem Vorschlag von Volkard nachgehen?Das ist doch mein Vorschlag.
Nur andere magic numbers.
Du: ((((monat)*100+tag)*100+stunde)*100+minute)*100+sekunde
Ich: ((((monat)*32+tag)*32+stunde)*64+minute)*64+sekunde
Aber Differenzen gehen dann nicht.
-
Naja Differenz halt mit Rückformung ^^.
Vielen Dank!