Forum: Mikrocontroller und Digitale Elektronik DateTime to uint32_t


von Zo R. (hsch1978)


Lesenswert?

Hallo,

ich habe folgendes Problem mit einer Konvertierung.
In einer DateTime Struktur ist der Tag, Monat und Jahr enthalten.
Der Tag und Monat ist vom Datentyp uin8_t. Das Jahr hat den Datentyp 
uint16_t.
Jetzt sollen alle drei Werte in eine uin32_t Datentyp kopiert werden.

Beispiel:
Tag (uint8_t) = 5
Monat(uint8_t = 7
Jahr(uint16_t) = 23

Im folgenden soll dann die drei Werte so in der Variable drin stehen:
datetime_variable(uint32_t) = 5072023

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

datetime = Tag * 1000000 + Monat * 10000 + Jahr

War jetzt ncht soo schwierig, oder?

von Stefan F. (Gast)


Lesenswert?

datetime_variable = Tag*100000UL + Monat*10000UL + Jahr+2000

Ist das eine Hausaufgabe oder steckt da ein tieferer Sinn hinter? Ich 
frage, weil ein Zeitpunkt als unit32 normalerweise völlig anders 
aussieht, nämlich Sekunden nach dem 1.1.1970 00:00:00.

von Klaus (feelfree)


Lesenswert?

Stefan F. schrieb:
> +2000

Upps, da hat Du recht. Warum aber das Jahr in einem uint16_t steckt wenn 
es nur 2-stellig abgespeichert wird...?

von Zo R. (hsch1978)


Lesenswert?

Vielen Dank!

EInen Punkt hätte ich noch. Der Monat soll nicht eine Stelle haben zum 
Beispiel beim Monat 4 sondern soll 04 anzeigen:

3042023

von Stefan F. (Gast)


Lesenswert?

Stefan F. schrieb:
> datetime_variable = Tag*100000UL + Monat*10000UL + Jahr+2000

Da fehlt eine Null
> datetime_variable = Tag*1000000UL + Monat*10000UL + Jahr+2000

von Stefan F. (Gast)


Lesenswert?

He S. schrieb:
> EInen Punkt hätte ich noch. Der Monat soll nicht eine Stelle haben zum
> Beispiel beim Monat 4 sondern soll 04 anzeigen:

Das ergibt sich von ganz alleine, weil der Tag davor steht.

von Zo R. (hsch1978)


Lesenswert?

Ich danke euch

von Rainer W. (rawi)


Lesenswert?

He S. schrieb:
> Im folgenden soll dann die drei Werte so in der Variable drin stehen:
> datetime_variable(uint32_t) = 5072023

Die Reihenfolge ist schon ein bisschen abartig.
Welchen tiefen Sinn mag es haben, die Wertigkeit der Stellen derart 
durcheinander zu würfeln?
Jeder Größer-/Kleiner-Vergleich (Sortieren) wird damit zu einer 
mittleren Orgie.

Stefan F. schrieb:
> Ich frage, weil ein Zeitpunkt als unit32 normalerweise völlig
> anders aussieht, nämlich Sekunden nach dem 1.1.1970 00:00:00.

Das wird schon spaßig, wenn man den 31.12.1969 23:59:59 in der Kodierung 
darstellen möchte.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

He S. schrieb:
> Vielen Dank!
>
> EInen Punkt hätte ich noch. Der Monat soll nicht eine Stelle haben zum
> Beispiel beim Monat 4 sondern soll 04 anzeigen:
>
> 3042023

Normalerweise steht das Jahr zuerst.
Warum?
Damit sortieren leichter wird, das ist wohl auch der Sinn
des Ganzen.

von Joe L. (joelisa)


Lesenswert?

Rainer W. schrieb:
> He S. schrieb:
>> Im folgenden soll dann die drei Werte so in der Variable drin stehen:
>> datetime_variable(uint32_t) = 5072023
>
> Die Reihenfolge ist schon ein bisschen abartig.
> Welchen tiefen Sinn mag es haben, die Wertigkeit der Stellen derart
> durcheinander zu würfeln?
> Jeder Größer-/Kleiner-Vergleich (Sortieren) wird damit zu einer
> mittleren Orgie.

Agree!

Würden sich die Leute blos mal die ISO-8601 (oder auch DIN-5008, rfc3339 
...) ansehen, als immer was Neues "erfinden" zu wollen ...

> Stefan F. schrieb:
>> Ich frage, weil ein Zeitpunkt als unit32 normalerweise völlig
>> anders aussieht, nämlich Sekunden nach dem 1.1.1970 00:00:00.
>
> Das wird schon spaßig, wenn man den 31.12.1969 23:59:59 in der Kodierung
> darstellen möchte.

Jede Codierung hat seine Schwächen - besonders aber die des TO's, 
angefangen bei seinem "Jahr(uint16_t)". Vor dem Jahr 2000 ist da nichts 
...

Stefan F.'s Vorschlag ist etwas unvollständig dargestellt. Die Unix 
Epoch auf die er sich wohl bezieht (Unix time  POSIX time  Unix 
timestamp), "ist die Anzahl der Sekunden, die seit dem 1. Januar 1970 
(Mitternacht UTC/GMT) vergangen sind, ohne Schaltsekunden (in 
ISO-8601-Darstellung also 1970-01-01T00:00:00Z)".

Siehe auch: https://de.wikipedia.org/wiki/Unixzeit. Dort wird auch auf 
das Jahr-2038-Problem (eine weiter Schwäche) eingegangen.

Eine umfassende Zusammenstellung findet sich z.B. unter 
https://www.epochconverter.com/

von Alexander (alecxs)


Lesenswert?

He S. schrieb:
> 3042023

30.04.2023? jede Kamera macht das seit Jahrzenten richtig 
IMG_20230508_120522.jpg

von Rainer W. (rawi)


Lesenswert?

Joe L. schrieb:
> Würden sich die Leute blos mal die ISO-8601 (oder auch DIN-5008, rfc3339
> ...) ansehen, als immer was Neues "erfinden" zu wollen ...

Selbst die DIN-5008 hat wegen der Dickköpfigkeit deutscher Schreibstuben 
nach fünf Jahren den Rückzug angetreten und seit der Ausgabe 2001, neben 
der Form 'YYYY-MM-DD' nach ISO-8601, das Format 'TT.MM.JJJJ' als wieder 
zulässig erklärt. Immerhin ist die Nutzung dieses Formates seit 2020 auf 
inländischen Schriftverkehr beschränkt worden.

: Bearbeitet durch User
von Horst S. (h3aau)


Lesenswert?

union Datum {
int_8 Tag;
int_8 Monat;
int_16 Jahr;
};

schon mal darüber nachgedacht?

: Bearbeitet durch User
von Klaus (feelfree)


Lesenswert?

Horst S. schrieb:
> schon mal darüber nachgedacht?

Ja, und als untauglicher Ansatz für das beschriebene Problem verworfen.

von Joe L. (joelisa)


Lesenswert?

Rainer W. schrieb:
> Selbst die DIN-5008 hat wegen der Dickköpfigkeit deutscher Schreibstuben
> nach fünf Jahren den Rückzug angetreten und seit der Ausgabe 2001, neben
> der Form 'YYYY-MM-DD' nach ISO-8601, das Format 'TT.MM.JJJJ' als wieder
> zulässig erklärt.

Fürwahr sitzen in denselben Schreibstuben -- und nicht nur da ! -- 
weiterhin die gleichen talentfreien Schnellmerker, die sich aktuell der 
Hoffnung ergeben, die staatlich verordnete Digitalisierung möge sich 
positiv auf ihren Intellekt auswirken.

Bei allem gebührenden Respekt erlaube ich mir schon jetzt zu orakeln, 
dass dem nicht so sein wird! Aber auch ich irre mich zuweilen ...

: Bearbeitet durch User
von Joe L. (joelisa)


Lesenswert?

Horst S. schrieb:
> union Datum {
> int_8 Tag;
> int_8 Monat;
> int_16 Jahr;
> };

GENIAL! Horst - you made my day!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.